依赖注入有用吗?

时间:2013-01-07 19:57:10

标签: dependency-injection

我是使用C#的依赖注入的新手,所以请原谅我的蹩脚问题。在投入时间和购买昂贵的书籍之前,我想发布这个问题。

在浏览了几个在线文档后,似乎使用依赖容器和配置文件可以使用它从一种类型的实现切换到另一种类型。但是,这可以通过if / else语句和一些配置设置轻松完成。

使用这种繁琐的实现只是为了从一个类改为另一个类有什么好处?我认为抽象和工厂模式更有用。也许我错了。

2 个答案:

答案 0 :(得分:1)

简而言之,依赖注入用于能够丢失类。通过使用if else语句,您可以在类之间引入依赖关系。将新实现添加到if else语句时,需要添加另一个else语句。

你可能已经读过http://en.m.wikipedia.org/wiki/Dependency_injection,因为他们有一个非常好的动机部分。

也许用不同的代码示例完成你的q。

答案 1 :(得分:1)

我是一个真正需要依赖注入的案例:

2汇编:1负责在您进行搜索时计算价格(让我们称之为搜索),第二汇负责计算所有选项的预订价格(让我们称之为预订)。

预订程序集已经引用了搜索(因为它需要知道计算全价的初始价格)。

但是这里有一个要求:我们需要搜索的价格包括所有的强制选项(在旅游行业是的,你有强制性选项),如“全室清洁”。

所以我无法在搜索中预订(因为循环引用)。所以我决定使用依赖注入。

我的搜索程序集定义了一个界面

public interface IAddMandatoryOptionService{
  void ChangeResultsWithMandatoryOptions(SearchResult[] results);
}

然后我的预订装配可以实现这个界面。

public class AddMandatoryOptionService : IAddMandatoryOptionService{
  public void ChangeResultsWithMandatoryOptions(SearchResult[] results){
  ...
  }
}

我的SearchService类现在看起来像

public class SearchService{
  public SearchService(IAddMandatoryOptionService optionService){
    this.OptionService = optionService;
  }
  public SearchResult[] Search(Filter filter){
    ...
    this.OptionService.ChangeResultsWithMandatoryOptions(results); 
    ...
    return results;
  }
}

所以我的搜索服务不依赖于AddMandatoryOptionService类(和预订程序集),但是它正在使用它的功能。当我创建我的服务时(在我的Application_Start中或使用DI框架),将注入好的IAddMandatoryOptionService

优点是:

  • 解决循环引用问题。
  • 如果我想对我的SearchService进行单元测试,我将不得不模拟/伪造IAddMandatoryOptionService。

这里对注入的需求更具技术性而非逻辑性,但我认为这种现实世界的场景可以帮助你明白这一点。

相关问题