Autofac寄存器组件类型

时间:2014-11-10 07:35:47

标签: c# asp.net-web-api castle-windsor autofac

在Castle中,我曾经做过以下操作来注册来自不同程序集的类型:

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

在Autofac中,我将上述代码更改为:

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

这是对的吗?

4 个答案:

答案 0 :(得分:25)

这是正确的方法:

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

答案 1 :(得分:3)

对于UWP,正确的方法有点改变:

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

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

对于每个程序集,您已采用属于程序集的单一类型并从中检索程序集的链接。然后饲料生成器此链接。重复。

答案 2 :(得分:0)

您可以使用As的谓词重载! 您可以从以GetInterfaces结尾的给定类型中获取所有带有"Repository"的接口,然后选择它们实现的第一个接口并注册它。

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

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

答案 3 :(得分:0)

有时AppDomain.CurrentDomain.GetAssemblies不返回依赖项目的程序集。 Difference between AppDomain.GetAssemblies and BuildManager.GetReferencedAssemblies

的详细说明

在这种情况下,我们应该使用项目内的任何类分别获取这些项目程序集并注册其类型。

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