Autofac IOC - RegisterAssemblyTypes与RegisterType

时间:2018-05-01 05:32:27

标签: asp.net-web-api2 autofac

我在浏览了webapi2应用程序中的文档后实现了AutoFac。在项目的不同组装中有服务。为了解决依赖关系,我尝试了以下三种独立工作的方法。虽然它有效但我觉得每个都有自己的用法来实现。每个人如何处理我的依赖关系以及使用它的位置?

builder.RegisterType<TestManager>().AsImplementedInterfaces();//first way  
builder.RegisterAssemblyTypes(typeof(TestManager).Assembly).AsImplementedInterfaces();//second way  
builder.RegisterType<TestManager>().As<ITestManager>();//third way

1 个答案:

答案 0 :(得分:1)

这三种方式中的每一种都有其优点和缺点。没有人更好或更糟,这取决于您将要应用它们的具体方案。

第一种方式:显式注册类型,带有隐式接口。

builder.RegisterType<TestManager>().AsImplementedInterfaces();//first way  

优点:

  • 如果修改类型以实现新接口,则无需向autofac寄存器添加任何内容,它将自动注册。因此:与(3)相比减少了维护,因为接口是隐含的。
  • 该类型的显式注册使您可以对注册进行细粒度控制。您可以忽略不在客户端应用程序中使用的类型,只注册您需要的类型。与(2)相比,这是一个优点。

缺点:

  • 在添加/删除类型时(不是在添加/删除接口时),您仍需要显式注册类型并更新autofac代码。所以:与(2)相比增加了维护,因为你必须注册每种类型。
  • 如果修改类型以实现新界面,可能会产生意外的副作用,因为如果不向autofac寄存器添加任何内容,它将自动注册。

第二种方式:注册程序集中的所有类型,而无需专门枚举类型或接口。

builder.RegisterAssemblyTypes(typeof(TestManager).Assembly)
    .AsImplementedInterfaces();//second way  

优点:

  • 非常适合简单的应用程序。
  • 非常方便,如果您的注册大多是简单的,并且不想在autofac模块中进行很多配置。
  • 在程序集中添加/删除类型或接口时,不必向autofac配置添加任何内容。
  • 与其他两种方式相比,这种方法的主要好处是自动维护的维护非常少。

缺点:

  • 向程序集添加/删除类型时会出现频繁的副作用,因为它们会自动注册。
  • 如果使用此方法从多个程序集注册组件,则会出现问题。
  • 透明度较低:仅通过查看自动对焦代码很难知道是否注册了一个组件。
  • 您最终可以使用不同的配置注册两次。请记住,注册顺序很重要。
  • 也许您正在注册许多不需要的类型。程序集中的每个公共类型都会被注册。如果您的程序集非常大,或者您只打算使用其类型的子集,那么这种方法可能不是最好的。

第三种方式:使用显式接口显式注册类型。

builder.RegisterType<TestManager>().As<ITestManager>();//third way

优点:

  • 如果您的类型实现多个接口,则可以更好地控制。
  • 如果您需要在autofac代码中进行更复杂的注册,通常更适合。
  • 在代码中添加/删除类型或界面时避免副作用,除非您明确修改自动对焦代码,否则它们将不会被应用。
  • 所以:这三种方法的最佳控制,更适合复杂的autofac注册。

缺点:

  • 您需要明确注册每种类型。
  • 此方法需要更多维护autofac代码。通常,在更改代码中的类型/接口时必须更改它。所以:最大的autofac代码维护有三种方式。

我列举的确有更多优点/缺点。这些是我想到的。我认为它们可以成为你的一个很好的起点。您将在实际场景中使用它们来了解您喜欢哪一个。

您可能会使用这三种方式的某种组合。一种常见的方法是在简单场景中使用(2),并为需要更复杂注册的类型添加(1)或(3)的特定注册。如果您的注册需求不是那么简单,或者您的应用程序非常大,我不建议使用(2),因为很难知道您真正注册的是什么。 请记住,注册的顺序很重要。他们是累积的,最后一个赢了。因此,如果你打算使用(2)结合(1)或(3)你应该先做(2)然后做其他的(否则特定的注册将被普通的注册覆盖)。