C# 简单注入器中的寄存器部分打开通用

C# 简单注入器中的寄存器部分打开通用,c#,generics,dependency-injection,simple-injector,C#,Generics,Dependency Injection,Simple Injector,我试图注册一个开放的通用接口IService,并使用以下部分开放的实现类Service解决它。 在此场景中,T0将是固定的,来自Service和IService的T1将是相同的 理想情况下,它看起来像这样: container.Register(lifesture.Singleton) 但这是不正确的 我的问题是: 这有意义吗?还是有更好的办法。如果可能的话,我希望避免使用class服务 有可能吗 我没有发现这些优秀的文档在这方面有帮助。这当然是可能的,但您不能用C#表示部分打开的泛型类型。

我试图注册一个开放的通用接口
IService
,并使用以下部分开放的实现类
Service
解决它。 在此场景中,
T0
将是固定的,来自
Service
IService
T1
将是相同的

理想情况下,它看起来像这样:

container.Register(lifesture.Singleton)

但这是不正确的

我的问题是:

  • 这有意义吗?还是有更好的办法。如果可能的话,我希望避免使用class
    服务
  • 有可能吗

我没有发现这些优秀的文档在这方面有帮助。

这当然是可能的,但您不能用C#表示部分打开的泛型类型。您将需要恢复到反射。可以按如下方式指定部分打开的类型:

Type implementation =
    typeof(Service<,>).MakeGenericType(
        typeof(ExplicitType),
        typeof(Service<,>).GetGenericTypeArguments()[1]));
类型实现=
typeof(服务)。MakeGenericType(
类型(显式类型),
typeof(Service.GetGenericTypeArguments()[1]);
在Simple Injector中注册现在是儿童游戏:

container.Register(typeof(IService<>), implementation);
container.Register(typeof(IService),实现);
这有意义吗

您的示例非常“通用”(没有双关语),因此很难从中得出结论,但对于部分打开的泛型类型,有绝对好的用例。这就是为什么Simple Injector支持OOTB

我觉得这些优秀的文档对这个问题没有帮助


文档确实有,但在文档中它被称为“部分封闭”,这可能是您没有找到它的原因。

谢谢,这可能是我在互联网上找到的关于部分封闭泛型的唯一实用答案。