C # Dependency Injection - PullRequest
       17

C # Dependency Injection

4 голосов
/ 12 марта 2011

Я пытаюсь понять, понимаю ли я инъекцию зависимости.

У меня есть проект, который используется в качестве парсера. Он может анализировать текст с разделителями, ключ-значение, а также выполнять регулярные выражения.

Первый способ сделать это был в одной функции с переключателем. Следующим способом было поместить его в отдельные функции и вызывать его на основе переключателя

Следующим способом, которым я думал, было создание интерфейса и реализация класса для каждого типа. Это много работы? Приходит ли вопрос к функционированию или покажет ли это преимущества, которых я пока не вижу?

Я полагаю, что мои проблемы связаны с тем, что я изначально собирался реализовать интерфейс, а затем мне каждый раз требовался другой анализ для реализации нового класса. Но это все равно потребовало бы, чтобы я вошел и добавил это в некоторый тип логического потока, поскольку я не понимаю, как это сделать с помощью интегрированных сред.

Скажем, я добавляю другой способ анализа, основанный на тегах или xml. Создайте класс, реализующий интерфейсы, и затем мне нужно было бы добавить их в логику потока, чтобы создать их экземпляр в качестве этого интерфейса, если пользователь решит проанализировать этот тип текста. Есть какой-нибудь более понятный способ сделать это?

Ответы [ 4 ]

3 голосов
/ 12 марта 2011

Я думаю, что тебе действительно нужна Фабрика.Фабрика - это класс, который знает, учитывая некоторую информацию для работы, как создавать необходимые объекты нужного типа.В вашем случае вы создадите интерфейс парсера, а затем разделите классы, реализующие различные парсеры.Наконец, создайте фабрику синтаксического анализатора, которая, обладая некоторой способностью сообщать, какой тип синтаксического анализатора создать, создает и возвращает необходимый тип.Вот куда пошла бы ваша логика.Фабрика предоставляет способ локализовать логику создания для создаваемых элементов.

public interface IParser<T>
{
    T Parse<T>( string item );
}

public class KeyValueParser : IParser<KeyValue>
{
    KeyValuePair Parse<KeyValue>( string item );
}

...

public class ParserFactory
{
    public IParser<T> CreateParser<T>()
    {
        var type = typeof(T);
        if (type == typeof(KeyValuePair))
        {
            return new KeyValueParser();
        }
        ...
        throw new InvalidOperationException( "No matching parser type." );
    }
}

Некоторые другие предложили модель плагина, и, при необходимости, фабрика может быть адаптирована для чтения конфигурации плагина, загрузитьсоответствующие плагины, и создавать типы экземпляров по мере необходимости.В этом случае было бы более уместно думать о фабрике как о «менеджере», поскольку она делает больше, чем просто создает экземпляры.

2 голосов
/ 12 марта 2011

То, что вы описываете, только удаленно связано с Dependency Injection.Это, однако, плакатный пример Заменить Условное Полиморфизмом Рефакторинг (стр. 255), так что это определенно хорошая идея.

Это становится только DIесли вы решите полностью отказаться от условного и вместо этого внедрить Стратегию в потребителя .

2 голосов
/ 12 марта 2011

Я бы сказал, что вы на правильном пути, но вы немного не правы.Чтобы решить проблему синтаксического анализа, сначала нужно обратиться к методу Factory Method и шаблону Visitor.

  1. Посетители, которые обрабатывают различные типы ввода.
  2. Посетители создаются с помощью Factory Method.
  3. Фабрика внедряется как конструктор, выполняющий шаблон внедрения зависимостей.

Эта работа может быть вам интересна - http://www.exciton.cs.rice.edu/research/sigcse05/dp4rdp.pdf

0 голосов
/ 13 марта 2011

Я реализовал анализатор файлов, используя шаблон Abstract Factory. И моя фабрика просто запрашивает расширение файла, и исходя из этого, используя стратегию (или переключение регистра), я решаю, какой парсер создать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...