使用StructureMap仅创建单例

时间:2014-04-08 20:57:38

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

是否有任何选项可以为每个实现指定命名空间接口的类创建单例?目前,我所能做的就是:

ObjectFactory.Configure(c =>
        {
            c.Scan(x =>
            {
                x.Assembly("SomeAssembly");

                x.WithDefaultConventions();
            });                
        });

我希望此配置为业务服务提供单例,只需创建一次。

2 个答案:

答案 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>();
   });                
});

希望你会发现这很有用。