Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用列表进行依赖项反转<;T>;以某种方式_C#_Dependency Injection_Autofac_Factory_Dependency Inversion - Fatal编程技术网

C# 使用列表进行依赖项反转<;T>;以某种方式

C# 使用列表进行依赖项反转<;T>;以某种方式,c#,dependency-injection,autofac,factory,dependency-inversion,C#,Dependency Injection,Autofac,Factory,Dependency Inversion,如何在给定的类上实现依赖项反转,如下面的代码? 问题是类A中的函数“Add”,它包含new关键字 我正在使用Autofac进行依赖项注入 我应该创建一个在Autofac中注册的“IBFactory”,还是使用方法注入,或者完全其他的方法 公共A类{ 列表_List=新列表(); ILogger\u记录器; 公共A(ILogger记录器){//使用Autofac的依赖注入 _记录器=记录器; } 公共添加(对象X){ if(X是字符串) _添加(新B1()); 其他的 _添加(新的B2()); }

如何在给定的类上实现依赖项反转,如下面的代码? 问题是类A中的函数“Add”,它包含new关键字

我正在使用Autofac进行依赖项注入

我应该创建一个在Autofac中注册的“IBFactory”,还是使用方法注入,或者完全其他的方法

公共A类{
列表_List=新列表();
ILogger\u记录器;
公共A(ILogger记录器){//使用Autofac的依赖注入
_记录器=记录器;
}
公共添加(对象X){
if(X是字符串)
_添加(新B1());
其他的
_添加(新的B2());
}
}
公共接口B{
}
公开课B1:B{
}
公开课B2:B{
}

工厂代理可以在act中用作所需类型的工厂

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());
   }
}
公共A类{
列表_List=新列表();
专用只读ILogger记录器;
专用只读功能工厂1;
专用只读功能工厂2;
公共A(ILogger记录器,Func factory1,Func factory2){
//使用Autofac的依赖性注射
this.logger=记录器;
this.factory1=factory1;
this.factory2=factory2;
}
公共添加(对象X){
if(X是字符串)
_添加(factory1());
其他的
_添加(factory2());
}
}
如果在容器中注册了类型
T
,则Autofac将自动将对
Func
的依赖关系解析为通过容器创建
T
实例的工厂


参考资料:您是否在询问每次需要时如何通过Autofac实例化
B1
B2
?添加方法的返回类型是什么?@John Yes,基于给定的argument@ValeriuSeremet返回类型不重要,这只是一个示例即使使用依赖项注入,有时也可以只做
newb1()
newb2()
例如,如果B的实现是应用程序逻辑中的简单数据对象或叶节点,那么伪造它们通常没有什么好处,工厂的额外抽象层只是额外的抽象层。非常感谢!这正是我要找的