代码之家  ›  专栏  ›  技术社区  ›  Romain Vergnory

简单注入器中的寄存器部分打开泛型

  •  3
  • Romain Vergnory  · 技术社区  · 7 年前

    我正在尝试注册一个开放的通用接口 IService<T1> Service<T0, T1> . 在这种情况下, T0 T1 Service IService 都是一样的。

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

    但这是不正确的。

    • 这有意义吗?还是有更好的方法。我想避免上课 Service<ExplicitType,>
    • 有可能吗?

    我觉得这些很棒的文档对这件事没有帮助。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Steven    5 年前

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

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

    在Simple Injector中注册现在是儿童游戏:

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

    这有意义吗?

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

    文档实际上 information about this ,但在文档中它被称为“部分闭合”,这可能是您没有找到它的原因。