Dependency injection 使用StructureMap获取从基类继承的类型的唯一实例

Dependency injection 使用StructureMap获取从基类继承的类型的唯一实例,dependency-injection,inversion-of-control,structuremap,Dependency Injection,Inversion Of Control,Structuremap,我有一系列的服务,我总是想用StructureMap获得一个唯一的实例。现在,我可以通过如下配置每种类型来实现这一点: ObjectFactory.Initialize(x => { ... x.For<UserService>().AlwaysUnique(); ... }); ObjectFactory.Initialize(x=> { ... x、 For().AlwaysUnique(); ... }); 但我并不想对每种服务类型都这样做。所有服务类

我有一系列的服务,我总是想用StructureMap获得一个唯一的实例。现在,我可以通过如下配置每种类型来实现这一点:

ObjectFactory.Initialize(x =>
{
  ...

  x.For<UserService>().AlwaysUnique();

  ...
});
ObjectFactory.Initialize(x=>
{
...
x、 For().AlwaysUnique();
...
});

但我并不想对每种服务类型都这样做。所有服务类型都继承自
ServiceBase
-是否有任何方法将StructureMap配置为对所有继承自
ServiceBase
的类型使用
AlwaysUnique()

我认为您需要创建一个约定来实现这一点:

using StructureMap.Pipeline;
using StructureMap.TypeRules;
using StructureMap.Configuration.DSL;

public class ConcreteLifecycleConvention : StructureMap.Graph.IRegistrationConvention
{
    private readonly Type _baseType;
    private readonly ILifecycle _lifecycle;

    public ConcreteLifecycleConvention(Type baseType, ILifecycle lifecycle)
    {
        _baseType = baseType;
        _lifecycle = lifecycle;
    }

    public void ScanTypes(TypeSet types, Registry registry)
    {
        foreach(var type in types.AllTypes())
        {
            if (type.IsAbstract || !type.CanBeCreated() || !type.CanBeCastTo(_baseType))
                continue;

            registry.For(type).LifecycleIs(_lifecycle);
        }
    }
}
在扫描中应用约定:

ObjectFactory.Initialize(c =>
{
    c.Scan(scan =>
    {
        scan.TheCallingAssembly();
        scan.With(new ConcreteLifecycleConvention(typeof(ServiceBase), 
            new UniquePerRequestLifecycle()));
    });
});
作为旁注。使用内置约定,您可以使用
OnAddedPluginTypes
来指定生命周期,但是没有内置约定来注册在没有接口的情况下注册的混凝土

scan.WithDefaultConventions().OnAddedPluginTypes(x => 
    x.LifecycleIs(new UniquePerRequestLifecycle()));