嗨,我想检查一下我是否过度思考设计问题。我是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();
}
您使用 DI 注入服务的方法看起来绝对正确。
你是否会从中获得真正的好处是一个意见问题,并不是SO的问题,需要更多的背景。