设计方法 - 在简单的应用中使用DI

时间:2013-11-14 15:26:44

标签: dependency-injection inversion-of-control constructor-injection

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

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

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

所以我创建了一些代码(见下文)。

public interface IDataRepository
{
   void Save(object someObject);
}

public class DataRepository : IDataRepository
{
   public void Save(object someObject){}
}

Public interface ITradeXmlProcessor
{
    void ProcessXml;
}

public class TradeXmlProcessor : ITradeXmlProcessor
{
   IDataRepository iDataRepository;
   public void ProcessXml()
   {
      // Do work....
      SaveTradeData(someObject);
   }

   private void SaveTradeData(object someObject)
   {
       iDataRepository = new DataRepository();
       iDataRepository.Save(someObject));
   }
}

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

现在我的问题是,当我去测试这段代码时,我无法模拟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(); 
}

1 个答案:

答案 0 :(得分:1)

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

你是否会从中获得实际利益的问题是一个意见问题,对于SO来说不是一个真正的问题,需要更多的背景。