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

C# 基于派生类型的StructureMap开放泛型使用,c#,dependency-injection,structuremap,C#,Dependency Injection,Structuremap,我有两个实体基类: public abstract class EntityBase { } public abstract class ClientSpecificEntityBase : EntityBase 和两类实体: public class Thing : EntityBase { } public class ClientSpecificThing : ClientSpecificEntityBase { } 和两种类型的服务,它们都实现iSeries功能 我正在使用以下代码配

我有两个实体基类:

public abstract class EntityBase { }
public abstract class ClientSpecificEntityBase : EntityBase
和两类实体:

public class Thing : EntityBase { }
public class ClientSpecificThing : ClientSpecificEntityBase { }
和两种类型的服务,它们都实现iSeries功能

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

_.For(typeof(IService<>)).Use(typeof(ServiceBase<>));
_.For<IService<ClientSpecificEntityBase>>().Use<ClientSpecificServiceBase<ClientSpecificEntityBase>>();
但每次我尝试访问iSeries时:

我得到的是ServiceBase,而不是ClientSpecificServiceBase


当StructureMap映射ClientSpecificServiceBase时,有没有办法让它包含派生类型?

没有,你不能做你想做的事情。容器不会在注册的组件中查找泛型类型的基类

如果删除第一个注册,只留下

_.For<IService<ClientSpecificEntityBase>>()
    .Use<ClientSpecificServiceBase<ClientSpecificEntityBase>>();
现在,如果你打电话

var resolved = container.GetInstance<IService<ClientSpecificThing>>();
您将得到一个异常:

StructureMap.StructureMappConfigurationException:未注册任何默认实例,无法为类型“IService”自动确定

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

IService<ClientSpecificEntityBase>
因为一个泛型类型继承了另一个泛型类型,所以它可以使用它来实现这一点

IService<ClientSpecificThing>

除了手动映射这些派生类型之外,有没有其他方法可以让ScructReMap返回适当的iSeries设备?我查看了一个工厂,但我发现的示例使用了Activator.CreateInstance,我无法使用它,因为iSeries设备也使用依赖项注入。最后我切换到SimpleInjector,并能够使用以下两行:container.RegisterConditionTypeOfService、TypeOfClient SpecificServiceBase、,c=>TypeOfClient SpecificEntityBase.IsAssignableFromc.ServiceType.GetGenericArguments.Single;container.RegisterConditionTypeOfService,typeofServiceBase,c=>!c、 处理;
IService<ClientSpecificEntityBase>
IService<ClientSpecificThing>