我知道如何使用依赖注入,但我承认没有实际好处吧

这是这个 (注入依赖)

private readonly ICustomerService _customerService; public Billing(ICustomerService customerService) { _customerService = customerService; }

与此 (创建依赖性)

private readonly ICustomerService _customerService; public Billing() { _customerService = new CustomerService(); }

后者样本所以他们说是不好的,因为......它违反了DI ...当然没有什么是注射......但是如果DI就不会存在,什么是如此糟糕,是的CustomerService从结算类手动创建? 我看到了服务接口没有实际的优势有关互换性。

我要求的源代码一个实际的例子可以说,它是一个单元测试或显示一个切实可行的解决方案为什么是这么多的松耦合。

任何足以热衷于展示自己的DI肌肉和为什么它存在和实际权被应用?

UPDATE

所以,人们还没有全部读了我会在这里写我的短体验:

DI作为图案具有实际使用。 按照DI通过不注射人工服务的所有(一个贫穷的芒DI工具,所以他们说...)使用类似LightCore /团结DI框架,但要确保您使用合适的工作的工具。 这是我没有;-)制定MVVM / WPF应用程序我有其他要求LightCore /统一工具不能支持他们甚至是一个障碍。 我的解决方案是使用MEFEDMVVM与我很高兴。 现在我的服务都在运行时自动注入不能在启动时。:-)

--------------解决方案-------------

试想一下, CustomerService连接到您的CRM系统和数据库。 它创建了一大堆的网络连接检索有关客户数据 ​​,也许从数据库中读取额外的东西将数据返回到之前来补充Billing类在其计算中使用。

现在,你想单元测试Billing ,以确保它使计算是正确的(你不想发出错误的账单吧?)

你将如何单元测试Billing ,如果它的构造是绑到需要一个真正的CRM系统和数据库连接的类? 那岂不是更好地来注入依赖作为一个接口,轻松让您为测试提供了模拟的版本?

这就是为什么 DI是有用的。

了解如何和理解为什么是非常不同的东西..

一个DI最大的好处是单元测试。 在你的第二个例子是不可能的单元测试计费还没有测试的CustomerService(和环比也测试任何进一步的依赖)。 在你没有单元测试这种情况下,你是集成测试! 如果你想使用DI一个很好的理由,你不用看任何进一步比单元测试的理由..

DI进来有用的,当你想接口的不同实现传递给你的类,例如:单元测试。

假设您的结算构造函数是一个MVC控制器的构造函数,和你的CustomerService了IDataContext的某种形式作为参数。

Global.asax中

// Does the binding
ICustomerService binds to CustomerService
IDataContext binds to EntityFrameworkContext

客户服务

private IDataContext _datacontext;
public CustomerService(IDataContext dataContext)
{
_dataContext = dataContext;
}

public AddCustomer(Customer entity)
{
this._dataContext.Customers.Add(entity);
this._dataContext.SaveChanges;
}

MVC控制器

private ICustomerService _customerService;
public Billing(ICustomerService customerService)
{
_customerService = customerService;
}

public ActionResult NewCustomer()
{
Customer customer = new Customer(){ Name = "test" };
this._customerService.AddCustomer(customer);

return View();
}

假设你想单元测试服务,或控制器。 您将通过在CustomerServices,但你会传递一个假的实施EntityFrameWorkContext的。 这样一个FakeDbContext,实现IDataContext,被传递给客户的服务。

该FakeDbContext可能只是存储在列表中的实体或更精细的存储机制,问题的关键是,你可以注入的依赖关系的不同实现,它允许你改变一个组件的行为,而无需在其他地方修改代码。

在我的经验,这不仅是避免集成测试(但是这是一个很重要的一点太)。 在内部类的实例可以创造大量的工作单元测试。 喜欢的CustomerService类可能取决于一个开放的数据库连接,配置文件服务是可用的和很多其他的东西时,你不应该知道,当你的工作是只测试结算类。

话虽这么说,有时是一种痛苦总是注入的一切。 注入框架可能会减轻了负担,但我不是在大风扇。 另一种计算器用户向我指出他所谓的“可怜男人的注射液”。 基本上,它由两个构造函数重载的:与注入的接口一个构造函数,一个没有。 没有人做什么,但实例化一个实现该接口的具体类,并将其传递给其他的构造函数。 它是这样的东西:

public class Billing
{
ICustomerService _customerService;

public Billing():this(new CustomerService()) {}

public Billing(ICustomerService customerService)
{
_customerService = customerService;
}
}

这样,你有办法测试时注入和一种方式来构造类和接口的默认实现。 不是每个人都喜欢这种模式,但我觉得它实用的一些场景。

分类:C# 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.387 (s). 10 q(s)