Внедрение зависимостей: что и где нужно вводить? - PullRequest
2 голосов
/ 02 августа 2011

У меня есть несколько классов, которые содержат возможность записи в файл CSV или XML. Для этого я передаю экземпляр StreamWriter или XmlWriter в методы ToCsv или ToXml.

public class HandFeed : JobItem
{
    // Snip

    public override void ToCsv(StreamWriter writer)
    {
        if (writer != null)
        {
            writer.WriteLine(JobItemsStrings.Job_HandFeed);
            writer.WriteLine(JobItemsStrings.Job_Total + SEPARATOR_CHAR + this.Total.ToString());
        }
    }

    public override void ToXml(XmlWriter writer)
    {
        if (writer != null)
        {
            writer.WriteStartElement("handfeed");
            writer.WriteElementString("total", this.Total.ToString());
            writer.WriteEndElement();
        }
    }
}

Теперь я собираюсь предоставить suport и для JSON, и если я продолжу в том же духе, это будет означать добавление другого метода ко всем моим классам по аналогии с ToJson или аналогичным.

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

Возможно, я смогу передать интерфейс и вызвать Write()? Это кажется , как будто это было бы более правильно, но опять же, как применить это на практике.

Итак, мои вопросы в двух словах:

  • Должны ли классы быть «введены» писателями?
  • Должны ли некоторые писатели быть «введены» в классы?
  • Придерживайтесь текущей настройки, но вместо этого создайте какую-то форму интерфейса?

Любой совет приветствуется.

Ответы [ 2 ]

1 голос
/ 02 августа 2011

Вы можете написать «Writers», которые соответствуют интерфейсу и вводить писателей. Однако это будет означать, что данный объект может быть записан только в одном формате в любом отдельном состоянии. Это не может быть проблемой для вас, а если нет, то это практический подход.

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

Должны ли классы сохранять и загружать себя через XML?

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

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

0 голосов
/ 02 августа 2011

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

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