您在依赖项中寻找什么来确定它是否应该是一个注入依赖项?

Cra*_*Zee 6 .net c# dependency-injection

我很难搞清楚什么时候应该注入一个依赖.让我们从我的项目中使用一个简单的例子:

class CompanyDetailProvider : ICompanyDetailProvider {
    private readonly FilePathProvider provider;
    public CompanyDetailProvider(FilePathProvider provider) {
        this.provider = provider;
    }

    public IEnumerable<CompanyDetail> GetCompanyDetailsForDate(DateTime date) {
        string path = this.provider.GetCompanyDetailFilePathForDate(date);
        var factory = new DataReaderFactory();
        Func<IDataReader> sourceProvider = () => factory.CreateReader(
            DataFileType.FlatFile, 
            path
        );
        var hydrator = new Hydrator<CompanyDetail>(sourceProvider);
        return hydrator;
    }
}
Run Code Online (Sandbox Code Playgroud)

(不是生产质量!)

ICompanyDetailProvider负责CompanyDetail为消费者提供s的实例.具体实施CompanyDetailProvider由补水的情况下,确实是CompanyDetail从使用一个文件Hydrator<T>,它使用反射来填充的情况下,T从来源IDataReader.显然CompanyDetailProvider依赖于DataReaderFactory(返回OleDbDataReader给定文件路径的实例)和Hydrator.是否应注入这些依赖关系?注射是否正确FilePathProvider?我应该检查什么品质来决定是否应该注射它们?

Chr*_*sic 1

如何确定一个类是否应该使用依赖注入


这个类需要外部依赖吗?

如果是,则注射。

如果不是,则没有依赖性。

回答“注入 FilePathProvider 是否正确?” 是的,这是对的。

编辑:为了澄清,任何外部依赖项都是您调用不相关但依赖的类的地方,特别是当它涉及物理资源(例如从磁盘读取文件路径)时,但这也意味着任何类型的服务或模型类的逻辑独立于类的核心功能。

一般来说,只要您致电新接线员,就可以推测出这一点。在大多数情况下,当 new 运算符必须处理数据传输对象以外的任何类时,您希望重构 new 运算符的所有用法。当类位于使用位置的内部时,如果可以降低复杂性(例如 new DataReaderFactory()),则新语句可能没问题,但这似乎也是构造函数注入的一个非常好的候选者。