外部默认与本地默认

时间:2012-03-03 18:12:52

标签: oop design-patterns dependency-injection anti-patterns

我正在阅读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容器在应用程序的组合根处连接(选择有趣的)依赖项吗?

0 个答案:

没有答案