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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取使用StructureMap从基类继承的唯一类型实例相关的知识,希望对你有一定的参考价值。

我有一堆服务,我总是希望用StructureMap获得一个独特的实例。现在,我可以通过配置每种类型来实现这一点:

ObjectFactory.Initialize(x =>
{
  ...

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

  ...
});

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

答案

我认为你需要创建一个约定来实现这个目标:

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()));

以上是关于获取使用StructureMap从基类继承的唯一类型实例的主要内容,如果未能解决你的问题,请参考以下文章

错误:与 'operator=' 不匹配。试图从基类继承并从基类初始化?

Qt - 从基类继承一个类

在 Kotlin 中使用 Jpa 注释从基类继承父属性

从基类创建继承类

派生类不从基类继承重载方法

将成员添加到从基类继承的结构