web-dev-qa-db-fra.com

Enregistrement automatique Types d'assemblages

Dans Castle, j'avais l'habitude de faire ce qui suit pour enregistrer des types provenant d'une autre assemblée:

Classes.FromAssemblyNamed("MyServer.DAL")
       .Where(type => type.Name.EndsWith("Repository"))
       .WithServiceAllInterfaces()
       .LifestylePerWebRequest(),

Dans Autofac, je change le code ci-dessus en ceci:

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
       .Where(t => t.Name.EndsWith("Repository"))
       .InstancePerRequest();

Est-ce correct?

17
Ivan-Mark Debono

C'est la bonne façon:

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
       .Where(t => t.Name.EndsWith("Repository"))
       .AsImplementedInterfaces()
       .InstancePerRequest();
23
Ivan-Mark Debono

Pour UWP, la manière correcte est un peu différente:

   var assemblyType = typeof(MyCustomAssemblyType).GetTypeInfo();

   builder.RegisterAssemblyTypes(assemblyType.Assembly)
   .Where(t => t.Name.EndsWith("Repository"))
   .AsImplementedInterfaces()
   .InstancePerRequest();

Pour chaque assemblage, vous devez prendre un type unique appartenant à l'assemblé et en récupérer le lien. Puis alimentateur constructeur ce lien. Répéter.

3
Ingerdev

Vous pouvez utiliser la surcharge du prédicat As! Vous pouvez obtenir toutes les interfaces avec GetInterfaces à partir des types donnés se terminant par "Repository", puis sélectionner la première interface qu'elles implémentent et l'enregistrer.

var Assembly = Assembly.GetExecutingAssembly();
ContainerBuilder builder = new ContainerBuilder();

builder.RegisterAssemblyTypes(Assembly)
    .Where(t => t.Name.EndsWith("Repository"))
    .As(t => t.GetInterfaces()[0]);
0
Shahar Shokrani