在简单的进样器中注册部分开放的通

时间:2017-08-02 15:22:05

标签: c# generics dependency-injection simple-injector

我正在尝试注册一个开放的通用接口IService<T1>,并使用以下部分打开的实现类Service<T0, T1>来解决它。 在这种情况下,T0将被修复,T1Service中的IService将是相同的。

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

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

但那是不正确的c#。

我的问题是:

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

我没有找到有关此问题的优秀文档。

1 个答案:

答案 0 :(得分:0)

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

Type implementation =
    typeof(Service<,>).MakeGenericType(
        typeof(ExplicitType),
        typeof(Service<,>).GetGenericTypeArguments()[1]));

简单注射器中的注册现在是儿童游戏:

container.Register(typeof(IService<>), implementation);
  

这有意义吗?

你的例子是非常普遍的&#39; (没有双关语意)所以很难从中得出结论,但对于部分开放的泛型类型有绝对好的用例。这就是Simple Injector为他们提供OOTB支持的原因。

  

我没有找到有关此问题的优秀文档。

文档实际上有information about this,但您在文档中称为&#34;部分关闭&#34;,这可能是您没有找到它的原因。