2014-10-16 60 views
0

我在我的項目中使用Castle Windsor。我想要偷懶的決心服務和repositories.The樣本代碼:解決後發佈服務

public IPersonService PersonService 
    { 
     get { return _windsorContainer.Resolve<IPersonService>(); } 
     set { _windsorContainer.Resolve<IPersonService>(value); } 
    } 

    public ICityService CityService 
    { 
     get { return _windsorContainer.Resolve<ICityService>(); } 
     set { _windsorContainer.Resolve<ICityService>(value); } 
    } 

    public IPhoneService PhoneService 
    { 
     get { return _windsorContainer.Resolve<IPhoneService>(); } 
     set { _windsorContainer.Resolve<IPhoneService>(value); } 
    } 

的問題是:當解決完了,怎麼我需要做的,釋放這些。 TNX


編輯

我頂班是:

public class PhonebookApplication 
{ 
    public WindsorContainer _windsorContainer; 

    private void InitializeWindsor() 
    { 
     _windsorContainer = new WindsorContainer(); 
     _windsorContainer.Install(Configuration.FromXmlFile("Castle.config")); 
    } 

    public void Dispose() 
    { 
     if (_windsorContainer != null) 
     { 
      _windsorContainer.Dispose(); 
     } 
    } 

    private static readonly Lazy<PhonebookApplication> s_Current = new Lazy<PhonebookApplication>(() => new PhonebookApplication(), true); 

    public static PhonebookApplication Current 
    { 
     get { return s_Current.Value; } 
    } 

    public void ApplicationStart() 
    { 
     InitializeWindsor(); 
    } 


    //Service count increaseble as your have. 
    public IPersonService PersonService 
    { 
     get { return _windsorContainer.Resolve<IPersonService>(); } 
     set { _windsorContainer.Resolve<IPersonService>(value); } 
    } 

    public ICityService CityService 
    { 
     get { return _windsorContainer.Resolve<ICityService>(); } 
     set { _windsorContainer.Resolve<ICityService>(value); } 
    } 

    public IPhoneService PhoneService 
    { 
     get { return _windsorContainer.Resolve<IPhoneService>(); } 
     set { _windsorContainer.Resolve<IPhoneService>(value); } 
    } 
} 

}

,如果我想調用的方法在HomeController的,我用的方法PhoneBookApplication.Current.PhoneService.GetAllList() ,那麼我想調用release當前解析的服務,當方法調用完成後。如果我注入這個類的構造函數所有工廠類,屋頂類是如此依賴,因此我不想使用ctor注入任何地方。

回答

2

不要這樣做 - 您可以使用Windsors TypedFactory faclity來在運行時解析和發佈組件。

您只需要創建一個接口:

public interface IPersonServiceFactory 
{ 
    IPersonService Create(); 

    void Release(IPersonService svc); 
} 

然後註冊AsFactory

container.Register(Component.For<IPersonServiceFactory>().AsFactory()); 

則工廠注入到你的類:

public class SomeClass 
{ 
    public SomeClass(IPersonServiceFactory personServiceFactory) 
    { 
     IPersonService svc = personServiceFactory.Create(); 

     // Do some work with the service 
     svc.Blah(); 

     // Now release it 
     personServiceFactory.Release(svc); 
    } 
} 

你需要確保你已經在引導代碼中添加TypedFactoryFacility類型的容器:

container.AddFacility<TypedFactoryFacility>(); 

附錄:

您還可以,如果你需要添加任何特殊的解析邏輯創建工廠界面自定義解析:

container.Register(Component.For<IPersonServiceFactory>().AsFactory(x => x.SelectedWith<PersonServiceFactoryComponentSelector>())); 

不要忘記註冊它太

container.Register(Component.For<PersonServiceFactoryComponentSelector>()); 

實施肩膀d子類DefaultTypedFactoryComponentSelector並且可以取代解析組件名稱的方法

例如,你可能要一個參數添加到Create()工廠方法,因此,它需要一個布爾值Create(bool useAlternateComponent)確定是否使用一個組件或其他:

public class DispatcherFactoryComponentSelector : DefaultTypedFactoryComponentSelector 
{ 
    protected override string GetComponentName(System.Reflection.MethodInfo method, object[] arguments) 
    { 
     if(arguments[0] is bool && (bool)arguments[0] == true) 
     // Return a certain component name 
     else 
     // Return a different component name 
    } 
} 
+0

謝謝您的回答,你的答案是我的部分答案,這situtation,如果我想運行一個方法,然後我依賴於注入「IPersonServiceFactory personServiceFactory」,但我不想訪問一個方法與注入,我想通過一個靜態屋頂類訪問方法。 Roof.PersonService.Blah()等。如何在沒有注入的情況下實現工廠。 – 2014-10-16 11:37:50

+0

嗨,我可以實現工廠作爲攔截器? – 2014-10-16 12:23:26

+0

不知道你的攔截器如何在這裏工作,你必須考慮什麼會觸發攔截器釋放組件。我想你可以確保所有的接口都繼承'IDisposable',並讓攔截器在調用處理方法時釋放組件。你有什麼理由不想注入工廠嗎?你可以使用'container.Release()'發佈組件,是關於如何讓組件自動發佈的更多問題?你的組件是否被註冊爲瞬態?你能給出更多的實際應用背景嗎? – Charleh 2014-10-16 13:28:15