Dependency injection 设计方法-在简单应用程序中使用DI

Dependency injection 设计方法-在简单应用程序中使用DI,dependency-injection,inversion-of-control,constructor-injection,Dependency Injection,Inversion Of Control,Constructor Injection,嗨,我想检查一下我是否过度思考了设计问题。我是DI/IoC/TDD的新手,如果是,我很抱歉 犯了一个明显的错误 我有一个简单的应用程序,它将读取交易日志,读取一些XML,然后保存到数据库 理想情况下,我希望使用带有DI和IoC的TDD方法创建此应用程序 因此,我创建了一些代码(见下文) 现在对我来说,这里的问题是,当我去测试这段代码时,我无法模拟DataRepository对象 所以我考虑了DI,它看起来像: public class TradeXmlProcessor : ITradeXmlP

嗨,我想检查一下我是否过度思考了设计问题。我是DI/IoC/TDD的新手,如果是,我很抱歉 犯了一个明显的错误

我有一个简单的应用程序,它将读取交易日志,读取一些XML,然后保存到数据库


理想情况下,我希望使用带有DI和IoC的TDD方法创建此应用程序

因此,我创建了一些代码(见下文)

现在对我来说,这里的问题是,当我去测试这段代码时,我无法模拟DataRepository对象

所以我考虑了DI,它看起来像:

public class TradeXmlProcessor : ITradeXmlProcessor
{
   private IDataRepository _iDataRepository;
   public TradeXmlProcessor(IDataRepository iDataRepository)
   {
    _iDataRepository = iDataRepository;
   }

   // Use _iDataRepository in process methods.

   // ...
}
在我的程序课程中,我可以通过一个IDataRepository课程,但这是否太多了? 这也是正确的方法吗?我有点担心我可能遗漏了一些明显的东西

在可测试性方面,我能够将模拟的IDataRepository对象注入到ITradeXMLProcessor类中,对其进行处理,但不保存到数据库,这很好,但我真的需要模拟这样一个简单的操作吗?我看不到我从中真正获得的好处

public class ProgramClass
{
   IDataRepository iDataRepository = new DataRepository();
   ITradeXmlProcessor iTradeXmlProcessor = new TradeXmlProcessor(iDataRepository);
   iTradeXmlProcessor.ProcessXml(); 
}

您使用DI注入服务的方法看起来绝对正确


您是否能从中获得真正的好处,这是一个意见问题,不是一个真正的问题,需要更多的上下文。

“我想使用TDD方法创建此应用程序,其中包括DI和可能的IoC”您如何区分IoC和DI?既然您想使用TDD,从写一个测试开始,看看它会把你引向何方。如果您先编写SUT,您就不会使用TDD。与此相关的是:“我真的需要模拟这样一个简单的操作吗”-如果您希望在测试中严格隔离,那么是的,您需要-您将只模拟特定测试运行所需的注入依赖接口的确切部分。这确保了任何测试失败都100%归因于SUT,而不是例如,你甚至还不知道的具体依赖项中的一个细微缺陷。
public class ProgramClass
{
   IDataRepository iDataRepository = new DataRepository();
   ITradeXmlProcessor iTradeXmlProcessor = new TradeXmlProcessor(iDataRepository);
   iTradeXmlProcessor.ProcessXml(); 
}