2016-07-07 127 views
1

Managing Dependency Injection in C# with Autofac用手依赖注入:手工VS autofac

var di = new EmployeeObserver(employees, new Printer(Console.Out)); 
di.FindExperts(); 

与autofac的解释却是非常简洁的方式与downloadable source code

依赖注入:

ContainerBuilder autofac = new ContainerBuilder(); 
autofac.Register(o => new EmployeeObserver(o.Resolve<IList<Employee>>(), o.Resolve<IPrinter>())); 
autofac.RegisterType<Printer>().As<IPrinter>(); 
autofac.RegisterInstance(employees).As<IList<Employee>>(); 
autofac.RegisterInstance(Console.Out).As<TextWriter>(); 
using (var container = autofac.Build()) 
{ 
    container.Resolve<EmployeeObserver>().FindExperts(); 
} 

在其他一些Q &作为它表示我们可以在编写单元测试时看到autofac的优势。

除此之外,有人可以给出理由或细节更多为什么我应该使用autofac而不是手动依赖注入更复杂的代码?

它说:

可以在这个特殊的例子,很难看出为什么这种方法 比手工配置依赖注入更好,但你 应该注意一个重要的事情 - 与Autofac每个组件 独立于所有其他配置,这就是当你的应用程序变得更加复杂时, 会有什么不同。

你能指出一个这种情况的复杂版本的例子,它显示了我将坚持使用autofac用法vs依赖的优势吗?

+0

相关:https://stackoverflow.com/questions/32032771/using-dependency-injection-without-any-di-framework – Steven

+0

你确定其他地方谈论在单元测试中使用_autofac_,或者只是_dependency injection_在单元测试?您是否具体询问单元测试部分,或者一般情况下的DI/autofac?这是一个相当广泛的主题,所以要在这里回答你需要对你的问题做出相当准确的判断。 –

+0

@JamesThorpe尤其不是单元测试部分,而是后者 –

回答

1

在其他一些Q &作为,它说我们可以看到autofac的优势,使用,同时编写单元测试

你已经错过了这一点。 模拟依赖关系并因此编写单元测试的能力是依赖注入作为模式本身的优势。

的优势任何 DI容器(不仅Autofac)能够以某种方式配置依赖关系并在复杂场景中使用此配置。

想象一下,你有一些类,这取决于一些服务,而这又取决于一些其他服务,依此类推。

使用穷人的DI很难实现这一点,但DI容器可以解决这个问题。

+0

我认为,语言已经成为障碍。也许@asdf_enel_hak在DI模式和容器的正确轨道上,但表达得很差。 –

1

使用或不使用DI容器对单元测试没有影响。当你进行单元测试时,你不使用DI容器,因为单元测试通常处理一个或几个类,你可以很容易地连接在一起。

请注意,无论是否使用DI容器来组成你的对象仍然是一个高度置评的问题。在这里我提供了一个基于我在项目中使用依赖注入的经验的视角。

在矿井,Why DI containers fail with “complex” object graphs的制品,我定义这样一个简单的对象图的概念:

任何尺寸和具有以下两个属性的任何深度的对象图:

a)对于任何接口(或抽象),实现此类接口的最多一个类在对象图中使用。 b)对于任何类,在对象图中最多使用一个实例(或具有完全相同构造参数参数的多个实例)。该单个实例可以在图中多次使用。

当你有一个简单的对象图时,使用一个DI容器。

有关简单对象图的示例,请考虑您有20个服务接口,每个接口由一个类实现。例如。 IEmailService仅由EmailService实现,而ISMSService仅由SMSService等实现,并且您有30个ASP.NET控制器,每个控制器都取决于这些服务接口的任意数量。另外一些服务依赖于其他服务接口,例如OrderService取决于IEmailService

如果没有简单的对象图,即有复杂的对象图(对于大多数应用程序应用SOLID principles,情况就是这样),请不要使用DI容器,而应使用Pure DI

如果您将DI容器与复杂的对象图形一起使用,您最终将使用容器的复杂特征(如命名注册)来区分同一接口的不同实现或具有不同构造参数的对象之间的区别。这会让你的composition root难以维护。

您可能想看看我的this article关于Pure DI如何使您的作品根部清洁。