我正在阅读Mark Seemann的依赖注射书,我遇到了混蛋注射反模式,我并不完全理解。我想得到一些如何从本地拆分外国违约的指导。如果唯一的要求是外国违约是来自其他集会吗?
如果我有这样的设计(假设它是一个库类,那么我不允许使用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)都在同一个程序集中,但它们是一些外部工具或库的包装器,例如pdfReader的pdf框。
我发现这个问题很有意思Is there an alternative to bastard injection? (AKA poor man's injection via default constructor),但它并没有消除我的所有怀疑。如果有一天有人会添加新的文件阅读器怎么办?如果使用默认构造函数,则无法让文档阅读器了解新的特定阅读器。我应该删除默认构造函数并强制库用户使用IoC容器在应用程序的组合根处连接(选择有趣的)依赖项吗?