v1.1.0.0: Add multilanguage support and remoting architecture

10/15/2009 - Marco (updated on 9/18/2020)

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.

New Features

  • QNO-1627: Added support for object graphs
  • QNO-1570: Added support for multiple application and data languages
  • QNO-1564: Added support for querying data from an application server instead of directly from a database (remote queries)
  • QNO-1572: Added support for modeled remote methods
  • QNO-1562: Enumerated types can be extended with user values
  • QNO-1563: The metadata can now contain lists of typed constants (resources)


  • QNO-1609: added initial support for the ASP.NET MVC library
  • QNO-1610, QNO-1461, QNO-1151, QNO-1601, QNO-1602, QNO-1603: improved toolkit configuration to prevent common errors; consolidate startup for standalone applications
  • QNO-1555: Startup code now works with any kind of Winforms form, instead of just MainFormBase
  • QNO-1611: improved import support for SQL Server (added smalldatetime and tinyint)
  • QNO-1641, QNO-1640, QNO-1639: Reduced size of models; reduced and adjusted API-footprint
  • QNO-1642, QNO-1643: Improvements to console applications and command-line handling
  • QNO-1646, QNO-1647: Changes to IApplicationOptions, IApplicationToolkit and IApplicationContext
  • QNO-205, QNO-1744, QNO-1745: Huge improvements to building and saving object graphs
  • QNO-1505: New and improved API for retrieving data available on the IDataConnection; IDataItem and some methods of IDataList are now deprecated.
  • QNO-1657: Improved integration with Linq queries by accepting and returning IEnumerable<T> instead of IList<T> or IMetaList<T> wherever possible.

Breaking changes

QNO-1610: startup configuration

The Encodo.Quino.App.ConfigurableApplicationToolkit.Model property is no longer writable and the constructor no longer accepts a parameter of type IMetaModel. To address the compile error for an application using a model called MyModel, do one of the following:

If you assigned the propery directly:

 1. Remove the assignment to `Model = MyModel.Instance`.
 2. Add `ModelLoader = new ModelLoader(MyModel.Instance);`

If you used the constructor parameter:

 1. Change the parameter from `MyModel.Instance` to `new ModelLoader(MyModel.Instance)`

Now you should be able to compile again.

 1. Run the code generator to update the generated code for your model.
 2. 1. Replace the reference to `new ModelLoader(MyModel.Instance)` with `MyModel.Loader`.[QNO-1617](https://secure.encodo.ch/jira/browse/QNO-1617): field made private

Any references to Encodo.Quino.Winform.DX.MainForm._workplaceControl should be replaced with Encodo.Quino.Winform.DX.MainForm.WorkplaceControlQNO-1639: Metadata changes IMetaBase no longer has the "MetaId", "LogicalParent", "BasedOn" and "Root" properties; instead these properties have been moved to the sub-interfaces from which they were actually needed.

Though these changes should cause no problem for applications, the new locations for these properties are as follows:

IMetaUnique.MetaId IMetaUnique.LogicalParent IMetaElement.BasedOn IMetaElement.RootQNO-1630: SortDirection moved to new namespace

The SortDirection enumeration has moved to the Encodo.Quino.Data namespace. References to Encodo.Quino.Meta.SortDirection should be updated to use the new namespace (Alt+Enter if you have R#).QNO-1643: Console and command-line changes

The ConsoleApplicationController.Start and ConsoleApplicationController.Shutdown methods are no longer available; instead, use ConsoleApplicationController.Run, passing a method that accepts an IApplicationContext.

Here's the standard pattern from Quino 1.0.5 and earlier:

internal void Main()
  var controller = new ConsoleApplicationController();

    var toolkit = new MyToolkit() { ... };

    var application = controller.Start(toolkit, ...);

    if (controller.GetStatus(application) == ApplicationContextStatus.Ready)
      // Execute application code

The new pattern removes much of this boilerplate code:

internal void Main()
  new ConsoleApplicationController().Run(
    new MyToolkit() { ... },

internal void ProcessApplicationCode(IApplicationContext application)
  // Execute application code
```[QNO-1642](https://secure.encodo.ch/jira/browse/QNO-1642): Command-line handling

The class `CommandLineBasedApplicationOptions` no longer exists. Instead, to customize the command-line handling, use the new `IApplicationToolkit.CommandLineProcessor` property. Use the `ApplicationToolkit.CommandLineOptionNames` constants to access predefined command-line parameters and add application-specific ones.

See the `DemoApplicationToolkit` class in the "Demo" solution in the release for an example.[QNO-1646](https://secure.encodo.ch/jira/browse/QNO-1646): Merged `IApplicationOptions` and `IApplicationToolkit`

`Options` are no longer available on `IApplicationToolkit`; instead, change all references to `Options` to reference the toolkit directly. `IApplicationContext` also no longer has `Options`; instead, change all references to `Options` to reference the new property `IApplicationContext.Toolkit`.[QNO-1658](https://secure.encodo.ch/jira/browse/QNO-1658): ISearchableList and IMessageList have been removed

As mentioned in [QNO-1658](https://secure.encodo.ch/jira/browse/QNO-1658), these two interfaces no longer exist; code that uses them should use an IList instead and use the LINQ functions instead of the Find* methods previously available.

For example:

if (searchableList.FindFirst(item => item.Enabled) != null)


if (list.Any(item => item.Enabled))

As mentioned in issue [QNO-1661](https://secure.encodo.ch/jira/browse/QNO-1661), replace all uses of `ConfigurableApplicationToolkit` with `ApplicationToolkit`.[QNO-1725](https://secure.encodo.ch/jira/browse/QNO-1725): CSV parser no longer has "ElementParsed" and "RowParsed" events

Instead of attaching to the event, then parsing the text afterwards, applications must now pass all handlers to the `Parse` method as lambda functions:

var parser = new CSVParser(); var cells = new List(); parser.Parse(inputText, element => cells.Add(element.Data));

For such simple tasks as the one outlined above, there is now also a `CSVTools` class with some useful static methods:

var elements = CsvTools.GetElements(inputText); var lines = CsvTools.GetLines(inputText);

Many of the methods on the `MetaTools` static class have been moved to `MetaClassTools`, `MetaModelTools`, `MetaTypeTools`, `MetaPropertyTools` and `MetaExpressionTools`. Many of these methods have also been converted to extension methods so that they appear automatically in the code-completion for the appropriate types.[QNO-1716](https://secure.encodo.ch/jira/browse/QNO-1716): Changes to expression parsing

On top of that, there is no longer a static `IExpressionParser` available; instead, use the `MetaExpressionTools.Parse(...)` family of methods. This was done to ensure that access to expression parsing is centralized so that expression syntax and semantic errors are handled properly.[QNO-1700](https://secure.encodo.ch/jira/browse/QNO-1700), [QNO-1684](https://secure.encodo.ch/jira/browse/QNO-1684): ADO connections and commands no longer available by default

Applications can no longer get ADO objects from the `IDatabase`. Instead, there is an `IAdoDatabase` for non-Quino access and an `IMetaAdoDatabase` for Quino-based access. This was done to ensure that applications no longer make assumptions that there is a database available so that a transition to a remoting implementation is seamless.[QNO-1657](https://secure.encodo.ch/jira/browse/QNO-1657): `IList<T>` or `IMetaList<T>` replaced with `IEnumerable<T>` for many parameters and results

These were changed to improve integration with values returned by the Linq extension methods and to allow a more functional way of working with C# where data is retrieved only when it is actually used. This allows many calls to `ToList()` to be removed, although those calls should continue to work as well. However, methods that return an `IList` may need to be updated to either change the return type of the method (returning an `IEnumerable` instead) or by calling `ToList()`.[QNO-1571](https://secure.encodo.ch/jira/browse/QNO-1571): Added `IMetaLanguage` parameter to caption-retrieval functions

With the addition of multi-language support, it is no longer valid to simply retrieve a caption or text without indicating the language in which it should be retrieved. Many of the `ControlToolsDX` methods have changed to include an `IMetaLanguage` parameter. Applications should pass in the value of the `DisplayLanguage` property on the `IDataConnection` to use the default value.

ControlToolsDX.SetupLookupFromRelation(Properties, MetaRelation, connection.DisplayLanguage);

Sign up for our Newsletter