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.