是否有任何选项可以为每个实现指定命名空间接口的类创建单例?目前,我所能做的就是:
ObjectFactory.Configure(c =>
{
c.Scan(x =>
{
x.Assembly("SomeAssembly");
x.WithDefaultConventions();
});
});
我希望此配置为业务服务提供单例,只需创建一次。
答案 0 :(得分:1)
在使用程序集扫描时,有几种方法可以解决此问题。
使用StructureMap自定义属性
[PluginFamily(IsSingleton = true)]
public interface ISomeBusinessService
{...
这有利有弊。它使用起来非常简单,并且不需要很多关于StructureMap内部工作的知识。缺点是您必须装饰您的接口声明,并且您必须在业务服务程序集中引用StructureMap。
实施自定义ITypeScanner
public interface ITypeScanner
{
void Process(Type type, PluginGraph graph);
}
这可以完成您想要做的事情,而无需装饰您的接口或在业务服务程序集中引用StructureMap。但是,这确实需要您对程序集中的类型实现注册过程。有关更多信息,请参阅StructureMap网站Custom Scanning Conventions。如果您需要其他帮助,我可以详细说明。
答案 1 :(得分:0)
以下是实际实施:
public class ServiceSingletonConvention : DefaultConventionScanner
{
public override void Process(Type type, Registry registry)
{
base.Process(type, registry);
if (type.IsInterface || !type.Name.ToLower().EndsWith("service")) return;
var pluginType = FindPluginType(type); // This will get the interface
registry.For(pluginType).Singleton().Use(type);
}
}
你必须这样使用它:
ObjectFactory.Configure(c =>
{
c.Scan(x =>
{
x.Assembly("SomeAssembly");
x.Convention<ServiceSingletonConvention>();
});
});
希望你会发现这很有用。