Привет, я хочу проверить, не переусердняю ли я проблему дизайна или нет. Я довольно новичок в DI/IoC/TDD, так что извините, если я ошибаюсь .Дизайн-подход - использование DI в простом приложении
У меня есть простое приложение, которое будет считываться из торгового журнала, читать XML и затем сохранять в базе данных.
В идеале я хочу создать это приложение, используя TDD-подход с DI и, возможно, IoC.
Так что я создал код (см. Ниже).
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();
}
«Я хочу создать это приложение, используя TDD-подход с DI и, возможно, IoC». Как вы различаете IoC и DI? –
Поскольку вы хотите использовать TDD, * начните с написания теста * и посмотрите, к чему это приведет. Вы не используете TDD, если сначала пишете SUT. –
Просто по отношению к этому: «Мне действительно нужно высмеять такую простую операцию» - если вы хотите быть строго изолированным в своих тестах, то да, вы это сделаете - вы только издеваетесь над точными частями интерфейса инжекционной зависимости, который для тестирования SUT требуется конкретный тест. Это гарантирует, что любой отказ теста составляет 100%, относящийся к SUT, а не к примеру, к тонкой ошибке в конкретной зависимости, о которой вы даже не знаете. –