2014-10-16 70 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