こんにちは、設計上の問題を考えすぎていないかどうかを確認したいと思います。私は 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();
}