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?
C'est la bonne façon:
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.InstancePerRequest();
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.
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]);