0

是否有任何選項來爲例如每個實現來自指定命名空間的接口的類創建單例?目前我所能做的只是:使用StructureMap創建只有單身人士

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

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

我想要這個配置爲業務服務提供單例,只需要創建一次。

回答

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

希望你會發現這個有用。

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。如果你需要額外的幫助,我可以詳細說明。

+0

ITypeScanner顯然是更好的選擇。但是這個界面已經過時了。改用IRegistrationConvention。謝謝。 – codeRecap