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,>如果可能的话,我想避免上课。我发现优秀的文档对这个问题没有帮助。
这当然是可能的,但您无法在 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 支持的原因。
我发现优秀的文档对这个问题没有帮助。
该文档实际上有关于此的信息,但在文档中它被称为“部分封闭”,这可能是您没有找到它的原因。