0

我在一个工厂类中使用Castle.Windsor来创建所需类的实例。 您可以在下面找到示例。Castle.Windsor代码审查

public class MyFactory : IDisposable 
{ 
    protected readonly IKernel Kernel; 

    protected MyFactory(IKernel kernel) 
    { 
     Contract.Requires<ArgumentNullException>(
      kernel.NotNull(), 
      "'kernel' parameter must be initialized."); 

     Kernel = kernel; 
    } 

    public IMyType Create(long param1, long param2) 
    { 
     return Kernel.Resolve<IMyType>(
      new { numberOfRows, numberOfCells }); 
    } 

    public void Dispose() 
    { 
     DisposeManagedResources(); 
    } 

    protected virtual void DisposeManagedResources() 
    { 
     Kernel.Dispose(); 
    } 
} 
  1. 我不知道,我需要的IDisposable这里...应该怎么处理内核MyFactory实例脱手后吧?
  2. 我不知道IKernel(在构造函数中)是解决Create方法中IMyType的最佳方法。我猜,有人可以建议更优雅的版本:)

还有其他想法吗?

谢谢提前。

+0

嗯..我认为ServiceLocator可以帮助我... –

+0

为什么你这样做? MyFactory用在哪里? –

回答

1

作为一般规则,类只应该处理它拥有的资源。由于此资源是从外部提供的,因此该类不负责处理它,除非该资源的所有权是“明确”传递的。通过所有权的这种明确性通常是通过文档或通过使用通用设计模式来完成的。例如,工厂方法(名称为CreateXXX)将调用方的所有权与返回的实例一起传递是很自然的。另一方面,DI容器包含Get,GetInstanceResolve方法,并且它们不会将所有权传递给调用方。

但除此之外,在你的情况下,你正在处理DI容器。 DI容器实例通常应该在应用程序的整个持续时间内存活。虽然容器通常需要处理,但在这个类中调用处理显然是错误的地方。这个工厂班的职责不是这样做的。由于容器应该在申请期间存活,所以正确的位置是在申请拆解期间。例如,在ASP.NET应用程序中,这通常是global.asax中的Application_End事件。

+0

非常感谢。我决定使用CommonServiceLocator.WindsorAdapter类。 'MyFactory'类不是必需的 - ServiceLocator.Current.GetInstance ()应该创建一个新的必需类的实例。只是我无法找到如何使用带参数的构造函数......可能它会延迟初始化参数... –

+0

请勿使用Common Service Locator。您的应用程序不应直接或通过通用服务定位器界面调用容器。 [本文](http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx)明确解释了原因。 – Steven

+0

嗯......“一个可怕的开发者体验”......但我的工厂不会对容器有直接的依赖关系......没问题,当我的工厂类包含IKernel属性来创建新实例时,它是不错的练习吗? –