Внешний дефолт против местного дефолта - PullRequest
1 голос
/ 03 марта 2012

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

Что, если у меня такой дизайн (предполагается, что это класс библиотеки, поэтому я не могу использовать контейнер IoC):

namespace DocumentReader
{
public class DocumentReader : ISmartDocumentReader
{
    private readonly ISet<IDocumentReader> documentReaders;

    public DocumentReader(ISet<IDocumentReader> documentReaders)
    {
        this.documentReaders = documentReaders;
    }

    public DocumentReader()
        : this(new HashSet<IDocumentReader>(new IDocumentReader[] { new TxtReader(), new PdfReader(), new DocReader() }))
    {

    }

    public string Read(Stream stream, string fileType)
    {
        var reader = documentReaders.SingleOrDefault(r => r.SupportedFileType == fileType);
        if(reader == null)
            throw new ArgumentException("Not supported file type");

        return reader.Read(stream, fileType);
    }
}
}

после прочтения главы образцов в книге я сомневаюсь, что это правильный дизайн, цель в том, чтобы этот класс стал публичным API библиотеки.Все определенные программы чтения документов (pdf, txt, doc) находятся в одной сборке, но они являются обертками над некоторыми внешними инструментами или библиотеками, такими как pdf box для pdfReader.

Я нашел этот вопрос интересным Есть лиальтернатива инъекции ублюдка?(АКА-инъекция бедняка через конструктор по умолчанию) , но это не развеивает все мои сомнения.Что делать, если когда-нибудь кто-нибудь добавит новую программу для чтения файлов.Если используется конструктор по умолчанию, то будет невозможно сообщить читателю документа о новом конкретном читателе.Должен ли я удалить конструктор по умолчанию и заставить пользователей библиотеки связывать (выбирать интересные) зависимости в корне композиции приложения с помощью контейнера IoC?

...