Comment migrer vers Unity 5?
Découvrez les étapes clés et les problèmes courants lors de la migration d’Unity 2 à Unity 5, avec des solutions pour les changements de namespaces, configurations, et dépendances.
La mise à jour de vieux paquets nuget peut parfois poser des soucis. Je me suis pris la tête un moment pour la mise à jour du paquet Unity.
Je parle ici du paquet d'injection de dépendances.
Le projet sur lequel j'ai eu à faire cette mise à jour utilisait la version 2.1.505 datant de 2011. Nous en sommes à la version 5.11.
Du coup beaucoup de breaking changes entre les deux versions.
Voici les points importants pour la mise à jour entre ces deux versions.
Mise à jour du paquet
On commence par la mise à jour du paquet Unity dans les paquets Nuget. L'opération n'est pas complexe en soi c'est une simple mise à jour de paquets.
Problèmes
Namespace
Avec cette nouvelle version nous passons du namespace de Microsoft.Practices.Unity à Unity.
Changement plutôt simple.
J'en profite également pour retirer les références qui pourraient subsister dans les assemblies.
- Microsoft.Practices.Unity
- Microsoft.Practices.Unity.Configuration
The type 'IUnityContainer' is defined in an assembly that is not referenced.
La mise à jour peut parfois ne pas fonctionner correctement et il faudra réimporter le paquet Unity mis à jour.
The type or namespace name 'UnityConfigurationSection' could not be found
Avec la nouvelle version de Unity de nombreux paquets ont été créés pour dispatcher les fonctionnalités.
Pour UnityConfigurationSection, si vous l'utilisez, vous devrez ajouter le paquet Unity.Configuration aux projets en ayant besoin.
Le namespace Microsoft.Practices.Unity.Configuration reste inchangé.
The type or namespace name 'UnityServiceLocator' could not be found
Pour UnityServiceLocator, vous devez ajouter le paquet Unity.ServiceLocation.
Vous devrez remplacer le namespace utilisé de Microsoft.Practices.ServiceLocation vers Unity.ServiceLocation.
The type or namespace name 'IServiceLocator' could not be found
Pas de paquets complémentaire si vous avez ajouté le précédent : Unity.ServiceLocation.
Le paquet dont vous avez besoin fait parti de ses dépendances : CommonServiceLocator.
UnityDependencyResolver
Dans le projet que j'ai mis à jour il y a une utilisation de la classe UnityDependencyResolver. Vous pouvez retrouver cette classe dans le paquet Unity.Mvc.
Son namespace : Unity.AspNet.Mvc.
Configuration
La configuration Unity qui se situe dans les fichiers *.config doit elle aussi être modifiée.
Si vous avez le message ci-dessous :
An unhandled exception of type ‘System.Configuration.ConfigurationErrorsException’ occurred in System.Configuration.dll
Additional information: An error occurred creating the configuration section handler for unity: Could not load file or assembly ‘Microsoft.Practices.Unity.Configuration’ or one of its dependencies. The system cannot find the file specified.
Aucune inquiétude la classe UnityConfigurationSection n'est plus dans Microsoft.Practices.Unity.Configuration mais dans Unity.Configuration
Exemple de Web.config version Unity 2 :
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
...
</configSections>
...
</configuration>
Exemple de Web.config version Unity 5 :
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration" />
...
</configSections>
...
</configuration>
La configuration de l'interface avec sa classe concrète évolue également.
Version Unity 2 :
<unity>
<typeAliases>
<typeAlias alias="ILogger" type="Microsoft.Extensions.Logging.ILogger, Microsoft.Extensions.Logging.Abstractions" />
<typeAlias alias="Logger" type="Sample.Logger, Sample" />
</typeAliases>
<containers>
<container name="RepositoryContainer">
<types>
<type type="ILogger" mapTo="Logger" />
</types>
</container>
</containers>
</unity>
Version Unity 5 :
<unity>
<alias alias="ILogger" type="Microsoft.Extensions.Logging.ILogger, Microsoft.Extensions.Logging.Abstractions" />
<alias alias="Logger" type="Sample.Logger, Sample" />
<containers>
<container name="RepositoryContainer">
<register type="ILogger" mapTo="Logger" />
</container>
</containers>
</unity>
Conclusion
Beaucoup de chose à faire pour mettre à jour vers Unity 5. Il m'a fallu plusieurs heures pour trouver toutes les informations manquantes. La modification de la configuration a été la plus compliquée à trouver.
Merci à Sandeepkumar Gupta et à son article Configure Unity Container from config file qui m'a permise de finaliser ma migration.