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