繁体   English   中英

基于派生类型的StructureMap开放泛型使用

[英]StructureMap Open Generics Use Based on Derived Type

我有两个实体基类:

public abstract class EntityBase { }
public abstract class ClientSpecificEntityBase : EntityBase

和两类实体:

public class Thing : EntityBase { }
public class ClientSpecificThing : ClientSpecificEntityBase { }

和两种类型的服务,都实现了IService<T>

ServiceBase<T> : Service<T> where T : EntityBase
ClientSpecificServiceBase<T> : ServiceBase<T> where T : ClientSpecificEntityBase 

我正在使用以下代码来配置StructureMap:

_.For(typeof(IService<>)).Use(typeof(ServiceBase<>));
_.For<IService<ClientSpecificEntityBase>>().Use<ClientSpecificServiceBase<ClientSpecificEntityBase>>();

但是每次我尝试访问IService<ClientSpecificThing>

public ClientSpecificThingController(IService<ClientSpecificThing> service)

我正在获取ServiceBase<ClientSpecificThing>而不是ClientSpecificServiceBase<ClientSpecificThing>

有什么方法可以让StructureMap在映射ClientSpecificServiceBase<T>时包括派生类型?

不,你不能做你想做的事。 容器不会通过注册的组件查看泛型类型的基类。

如果您删除第一个注册,而仅留下,则这一点变得更加明显

_.For<IService<ClientSpecificEntityBase>>()
    .Use<ClientSpecificServiceBase<ClientSpecificEntityBase>>();

现在,如果你打电话

var resolved = container.GetInstance<IService<ClientSpecificThing>>();

您会得到一个例外:

StructureMap.StructureMapConfigurationException:没有注册默认实例,并且无法自动确定类型'IService'的实例

因此,并不是将StructureMap混淆在两个注册之间并返回错误的注册。 当您注册时,它不识别:

IService<ClientSpecificEntityBase>

它可以使用来实现这一点,因为一个泛型类型是从另一个继承的。

IService<ClientSpecificThing>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM