Autofac register assembly types

南楼画角 提交于 2020-05-09 20:34:37

问题


In Castle, I used to do the following to register types from a different assembly:

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

In Autofac, I change the above code to this:

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

Is it correct?


回答1:


This is the correct way:

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



回答2:


For UWP correct way is a bit alter:

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

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

For each assembly you have take single type that belongs assembly and retrieve assembly's link from it. Then feed builder this link. Repeat.




回答3:


You can use the As's predicate overload! You can get the all of the interfaces with GetInterfaces from the given types that ends with "Repository" and then select the first interface which they implement and register it.

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

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



回答4:


Sometimes AppDomain.CurrentDomain.GetAssemblies doesn't return assemblies of dependent projects. Detailed explanation here Difference between AppDomain.GetAssemblies and BuildManager.GetReferencedAssemblies

In those cases, we should get those project assemblies individually using any class inside the project and register its types.

var webAssembly = Assembly.GetExecutingAssembly();
var repoAssembly = Assembly.GetAssembly(typeof(SampleRepository)); // Assuming SampleRepository is within the Repository project
builder.RegisterAssemblyTypes(webAssembly, repoAssembly)
            .AsImplementedInterfaces();          


来源:https://stackoverflow.com/questions/26838880/autofac-register-assembly-types

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!