0

嗨,我想检查一下我是否在考虑设计问题。我对 DI/IoC/TDD 很陌生,如果我犯了一个明显的错误,我很抱歉。

我有一个简单的应用程序,它将从贸易日志中读取,读取一些 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(); 
}
4

1 回答 1

1

Your approach to using DI to inject a service looks absolutely correct.

The question of whether you will get real benefit out of it is a matter of opinion, is not really a question for SO, and requires a lot more context.

于 2013-11-14T17:18:49.050 回答