c# - 使用列表的依赖倒置在一个方法中
问题描述
如何在给定的类上实现依赖反转,如下面的代码?问题是类 A 中的函数“添加”,它包含新的关键字。
我正在使用 Autofac 进行依赖注入。
我应该创建一个在我的 Autofac 中注册的“IBFactory”,还是使用方法注入,或者完全是其他的东西?
public class A {
List<B> _list = new List<B>();
ILogger _logger;
public A(ILogger logger) { //Depency Injection using Autofac
_logger = logger;
}
public Add(object X) {
if (X is String)
_list.Add(new B1());
else
_list.Add(new B2());
}
}
public interface B {
}
public class B1 : B {
}
public class B2 : B {
}
解决方案
工厂委托可以用作所需类型的工厂
public class A {
List<B> _list = new List<B>();
private readonly ILogger logger;
private readonly Func<B1> factory1;
private readonly Func<B2> factory2;
public A(ILogger logger, Func<B1> factory1, Func<B2> factory2) {
//Depency Injection using Autofac
this.logger = logger;
this.factory1 = factory1;
this.factory2 = factory2;
}
public Add(object X) {
if (X is String)
_list.Add(factory1());
else
_list.Add(factory2());
}
}
如果
T
在容器中注册了类型,Autofac 将自动解析依赖Func<T>
作为通过容器创建T
实例的工厂。
参考Autofac:委托工厂
推荐阅读
- python - 使用 Trie 在标记化的句子中搜索短语
- c++ - 尝试使用指针遍历数组,但出现浮点指针错误/无法编译
- ios - 如何使用 XCode 12.4 从 Swift 3 迁移?
- postgresql - azure postgres pg_restore 无法在容器中找到转储文件
- pyspark - PySpark SQL 和危险函数(例如访问磁盘、访问网络、永远运行)
- java - 线程“main”java.lang.NoClassDefFoundError: org/kie/api/KieServices$Factory 与 Drools 版本 7.59.0 中的依赖项异常问题
- python - 无法在多模式 seq2seq 中计算输出 KerasTensor
- python - 如何访问数据框列中列表内的字典值
- c++ - C++内部链接的实际应用
- shell - 我想删除 zsh 启动时显示的“(不在 PATH env 变量中)”