将Singleton用于StructureMap中的所有扫描混凝土类型

时间:2018-08-02 10:57:27

标签: c# dependency-injection singleton inversion-of-control structuremap

我有一个接口IProperty(库集[1])和一个对应的基类BaseProperty(库集[2])。

一个名为 Properties 的文件夹,其中包含具有从BaseProperty派生的类型的程序集。

现在,我正在扫描 Properties 文件夹(来自应用程序组装[3]),以查找实现IProperty的类型。对于我发现的每种具体类型,我都想注册一个单例。这样一来,当我决定使用Container.GetInstance<MyProperty>()时,就会得到一个单例实例。

我拥有的第一个代码(显然不起作用):

    var container = new Container(c =>
    {
        c.Scan(s =>
        {
            s.AssembliesFromPath("Properties");
            s.AddAllTypesOf<IProperty>();
        });
    });

到目前为止我尝试过的事情:

  1. 创建新的IRegistrationconvention

    public class SingletonPropertyConvention : IRegistrationConvention
    {
        public void ScanTypes(TypeSet types, Registry registry)
        {
            // Only work on concrete types
            var foundTypes = types.FindTypes(TypeClassification.Concretes | TypeClassification.Closed).ToList();
    
            foundTypes.ForEach(type =>
            {
                if (!type.AllInterfaces().Contains(typeof(IProperty))) return;
                registry.For(typeof(IProperty)).Use(type).Singleton();
            });
        }
    }
    

    然后使用它进行扫描:

    var container = new Container(c =>
    {
        c.Scan(s =>
        {
            s.AssembliesFromPath("Properties");
            s.With(new SingletonPropertyConvention());
        });
    });
    

    这不会给我一个Container.GetInstance<MyProperty>()的单例。如果我将以上几行之一更改为:

            registry.For(type).Use(type).Singleton();
    

    这可能有用(编辑:,它没有用。我没有得到一个单例)。但是,当我想要该接口的所有实例时,它将无法工作:

            Container.GetAllInstances<IProperty>(); // returns an empty list
    

    我本可以使用Container.Forward<TFrom, TTo>(),但在编译时没有类型。


  1. 使用[Singleton]属性:

    [Singleton]
    public abstract class BaseProperty : IProperty
    {
        ...
    }
    

    这可能不起作用,因为它在基类上而不在具体类型上。但是我想要一个通用解决方案,因此,我不想将[Singleton]属性添加到每个单个派生类型。


感谢您的帮助!

0 个答案:

没有答案