在简单注入器中注册部分开放的泛型

Rom*_*ory 5 c# generics dependency-injection simple-injector

我正在尝试注册一个开放的通用接口IService<T1>并使用以下部分开放的实现类来解决它Service<T0, T1>。在这种情况下,T0是固定的,并且T1fromService和IService是相同的。

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

container.Register<IService<>, Service<ExplicitType,>>(Lifestyle.Singleton);

但这是不正确的c#。

我的问题是:

  • 那有意义吗 ?或者,还有更好的方法。Service<ExplicitType,>如果可能的话,我想避免上课。
  • 有可能吗?

我发现优秀的文档对这个问题没有帮助。

Ste*_*ven 5

这当然是可能的,但您无法在 C# 中表达部分开放的泛型类型。您将需要恢复到反射。您可以按如下方式指定部分开放类型:

Type implementation =
    typeof(Service<,>).MakeGenericType(
        typeof(ExplicitType),
        typeof(Service<,>).GetGenericTypeArguments()[1]));
Run Code Online (Sandbox Code Playgroud)

在 Simple Injector 中注册现在变得轻而易举:

container.Register(typeof(IService<>), implementation);
Run Code Online (Sandbox Code Playgroud)

那有意义吗?

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

我发现优秀的文档对这个问题没有帮助。

该文档实际上有关于此的信息,但在文档中它被称为“部分封闭”,这可能是您没有找到它的原因。