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?我应该检查什么品质来决定是否应该注射它们?
这个类需要外部依赖吗?
如果是,则注射。
如果不是,则没有依赖性。
回答“注入 FilePathProvider 是否正确?” 是的,这是对的。
编辑:为了澄清,任何外部依赖项都是您调用不相关但依赖的类的地方,特别是当它涉及物理资源(例如从磁盘读取文件路径)时,但这也意味着任何类型的服务或模型类的逻辑独立于类的核心功能。
一般来说,只要您致电新接线员,就可以推测出这一点。在大多数情况下,当 new 运算符必须处理数据传输对象以外的任何类时,您希望重构 new 运算符的所有用法。当类位于使用位置的内部时,如果可以降低复杂性(例如 new DataReaderFactory()),则新语句可能没问题,但这似乎也是构造函数注入的一个非常好的候选者。