Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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# 如何注册在LightInject中接受参数的开放泛型?_C#_Generics_Dependency Injection_Light Inject_Open Generics - Fatal编程技术网

C# 如何注册在LightInject中接受参数的开放泛型?

C# 如何注册在LightInject中接受参数的开放泛型?,c#,generics,dependency-injection,light-inject,open-generics,C#,Generics,Dependency Injection,Light Inject,Open Generics,我有以下泛型类,它取决于IBar: public class Foo<T> : IFoo<T> { public Foo(IBar bar, int value) { } ... } 公共类Foo:IFoo { 公共Foo(IBar条,int值){} ... } 理想情况下,我会在LightInject中使用类似的方法注册它: container.Register<IBar, Bar>(); container.Register&

我有以下泛型类,它取决于
IBar

public class Foo<T> : IFoo<T>
{
    public Foo(IBar bar, int value) { }
    
    ...
}
公共类Foo:IFoo
{
公共Foo(IBar条,int值){}
...
}
理想情况下,我会在LightInject中使用类似的方法注册它:

container.Register<IBar, Bar>();
container.Register<int, IFoo<>>((factory, value) => new Foo<>(factory.GetInstance<IBar>(), value))
container.Register();
container.Register((factory,value)=>newfoo(factory.GetInstance(),value))

因此,在运行时,我可以使用提供的值获取IFoo的实例:

container.GetInstance<IFoo<SomeType>>(42);
container.GetInstance(42);
但是,由于使用了开放的泛型
IFoo
,此代码显然无法编译:

container.Register((工厂,值)=>newfoo(…)
如果only Foo不是泛型类,那么根据官方文档,这一切都可以正常工作:

是否有针对泛型类的解决方案?这是否可以用其他方式书写,并且仍然可以实现同样的效果?我尝试使用以下语法,但是我失去了使用接受值的委托的能力(或者至少我不知道如何做)

container.Register(typeof(IFoo),typeof(Foo));

有什么想法吗?

Light Injection就是这样一个边缘库,可能没有现成的方法可以做到这一点,也许你应该下载源代码并实现自己的重载,或者向作者提交一个功能请求。你认为这可以用另一个库(.net framework)来实现吗,例如:Unity?“在运行时,我可以使用提供的值获取IFoo的实例“。最好防止在构造时将运行时数据注入组件。请参阅。大多数DI容器不允许在解析过程中注入运行时数据,而那些允许注入运行时数据的容器仅限于将该运行时数据注入解析最顶层的类,这通常会限制此类功能的用途。
container.Register<int, IFoo<>>((factory, value) => new Foo<>(...))
container.Register(typeof(IFoo<>), typeof(Foo<>));