我有一个接口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>();
});
});
到目前为止我尝试过的事情:
创建新的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>()
,但在编译时没有类型。
使用[Singleton]
属性:
[Singleton]
public abstract class BaseProperty : IProperty
{
...
}
这可能不起作用,因为它在基类上而不在具体类型上。但是我想要一个通用解决方案,因此,我不想将[Singleton]
属性添加到每个单个派生类型。
感谢您的帮助!