v1.8.5: New model-generation pattern, local databases and more!

11/27/2012 - Marco (updated on 11/13/2017)

The summary below describes major new features, items of note and breaking changes. The full list of issues is also available for those with access to the Encodo issue tracker.


  • Includes a new model-generation pattern with support in the framework. This pattern helps developers create models and modularize them in a scalable and understandable way. Developers can choose how much of the pattern to implement depending on model size to minimize the amount of effort required for small models. See A scalable pattern for building metadata for more information as well as several examples.
  • The code generator now supports generating one class per file instead of grouping all generated classes into a monolithic file. This policy is opt-in and must be enabled on the module-generation options (e.g. by setting IMetaModule.ClassOptions.OneClassPerFile = true for those modules where it is desired).
  • The Mongo database is now supported as a local database solution for small non-distributed solutions.[^1] This is perfect for demo applications and prototypes. See Running Quino applications with a local database for more information.
  • Modeled methods are now stateless and no longer use the global session. Slight changes have to be made to existing applications (listed below).

Breaking changes

  • The interface IConstantExpression no longer exists. Please update method signatures with IExpression instead.
  • Encodo.Quino.Meta.IMetaModuleGenerator has been moved to Encodo.Quino.Tools.ModelGenerators.IMetaModuleGenerator. Fix compile errors by including the new namespace.
  • The MetaBuilderBase no longer returns MetaGroupContainer; instead it returns IMetaGroupContainer. Code that expects the class rather than the interface will have to be updated to use the interface instead.
  • MetaBuilder.CreateWrapperClass() no longer adds the created class to the model. If this is the desired behavior, use MetaBuilder.AddWrapperClass() instead. In most cases, the extra class in the model was neither necessary nor desired, but we strongly recommend that you verify your calls to CreateWrapperClass() to make sure that it still does what you expect.
  • Modeled methods are now stateless and no longer use the global session. In order to support this, we added a requirement that modeled method classes must now implement the IMetaMethodImplementationContainer interface. There is only one method to implement -- SetSession() -- and you can use the MetaMethodImplementationContainer base class if you don't have another base class that you want to use. Regenerate code to update the generated class for remotable methods to a version that implements the interface.The generated remote methods can no longer be called without specifying the session to use for the remote-method call. For a given method interface -- IBusinessLogic say -- instead of calling ServiceLocator.GetInstance<IBusinessLogic>() to get the instance, use the helper method MetaMethodTools.GetInstance<TIBusinessLogic>(session) instead.

For example, in the Quino demo, the call to DeletePerson used to be:


Instead, you should call:

```**XML documentation** files are **no longer included** with the **source-only** release. Instead, you should generate the documentation files locally by calling the `deploydoc` target in the `Quino.build` NAnt file. This target can be called at any time to synchronize the XML documentation files with the current sources.

For example, when you download the Quino sources (and have NAnt in the system `PATH`), you can execute the following to build & deploy Quino as well as source-code documentation.

nant deploydoc deploy

  * As a result of updates made for the model-generation pattern, you will have to re-generate code for your model(s) in order to remove compiler warnings in that code.


[^1]: Naturally, the Mongo driver can also be used in a distributed solution. It is, as much as possible, a first-class driver for Quino with the following caveats: it supports neither foreign-key constraints nor transactions.

Sign up for our Newsletter