Released Catel 3.6

We are very proud to announce the release of Catel 3.6! In this blog post we will explain the most important changes. To see all the changes, please check out the release notes or the issue tracker.

ServiceLocator and TypeFactory improvements

Circular dependency protection

In this version we added circular dependency protection to the TypeFactory. This means that if there are types with a circular dependency using dependency injection, the TypeFactory will throw a CircularDependencyException with the exact type path which was used to create the type instead of a StackOverflow without any info. As you can see in the image below, when a dependency causes a circular dependency, you will now get an exception with really useful information (check out the TypePath).

Moved generic methods to extensions methods

We moved the generic methods such as ResolveType<TInterface>() to extension methods. They were already calling the non-generic parameters. This way if someone wants to implement his/her own ServiceLocator or TypeFactory, he/she doesn’t have to write all the extension methods (since they are called on the IServiceLocator and ITypeFactory).

Improved support for external container synchronization

Catel is the only framework that supports IoC container synchronization between containers (for example, with MEF or Unity). This version improves the way the synchronization handles both singleton and transient registrations between external containers. We also made a few performance improvements to the synchronization.

Added new services

There were several new services added.

SelectDirectoryService

This service works in the same manner as the SaveFileService and OpenFileService. It allows a user to select a directory in WPF.

ViewExportService

This service allows a developer to export a specific view based on the view model. To export a view based on a view model, use the following code:

Performance improvements

In this release we also focused a lot on performance. Upgrading from an older version to 3.6 should provide a significant performance improvement.

Among these changes were disabling the reflection cache (was actually slower), disabling the default subscription to MessageMediator (see CTL-74) and the introduction of the IDependencyPropertySelector. For more information about
performance, please check out the performance considerations in the documentation.

Fixed unreliable Loaded events in non-WPF technologies (Silverlight, Windows Phone and WinRT)

In WPF, the user controls are loaded from top => bottom. In other technologies these are random and unreliable. In version 3.6 we wrote the FrameworkElementLoadedManager to ensure that Loaded events in Catel are always reliable. This means that no matter what technology is used, the Loaded event is always fired from top => bottom in the visual tree.