3

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

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

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

4

2 回答 2

1

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

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

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

于 2013-01-07T20:08:21.757 回答
1

我有一个需要依赖注入的真实世界案例:

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

Booking 程序集已经在引用 Search(因为它需要知道初始价格来计算全价)。

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

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

我的搜索程序集定义了一个接口

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

然后我的 Booking Assembly 可以实现这个接口。

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 类(和 Booking 程序集),但它正在使用它的功能。当我创建我的服务时(在我的 Application_Start 或使用 DI 框架中)将注入良好的 IAddMandatoryOptionService

优点是:

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

这里需要注入更多的是技术性而非逻辑性,但我认为这种现实世界的场景可以帮助你理解这一点。

于 2013-01-08T10:11:28.207 回答