0

Привет, я хочу проверить, не переусердняю ли я проблему дизайна или нет. Я довольно новичок в 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(); 
} 
+0

«Я хочу создать это приложение, используя TDD-подход с DI и, возможно, IoC». Как вы различаете IoC и DI? –

+3

Поскольку вы хотите использовать TDD, * начните с написания теста * и посмотрите, к чему это приведет. Вы не используете TDD, если сначала пишете SUT. –

+0

Просто по отношению к этому: «Мне действительно нужно высмеять такую ​​простую операцию» - если вы хотите быть строго изолированным в своих тестах, то да, вы это сделаете - вы только издеваетесь над точными частями интерфейса инжекционной зависимости, который для тестирования SUT требуется конкретный тест. Это гарантирует, что любой отказ теста составляет 100%, относящийся к SUT, а не к примеру, к тонкой ошибке в конкретной зависимости, о которой вы даже не знаете. –

ответ

1

Ваш подход к использованию DI для внедрения сервиса выглядит абсолютно корректно.

Вопрос о том, получите ли вы реальную выгоду из этого, является вопросом мнения, на самом деле это не вопрос для SO, и для этого требуется гораздо больше контекста.

Смежные вопросы