基于派生类型的 StructureMap Open Generics 使用

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: No default Instance is registered and cannot be automatically determined for type 'IService'

所以这并不是 StructureMap 混淆了两个注册而返回了错误的注册。它不承认当你注册这个:

IService<ClientSpecificEntityBase>

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

IService<ClientSpecificThing>