我在一个工厂类中使用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();
}
}
还有其他想法吗?
谢谢你提前。
答案 0 :(得分:1)
作为一般规则,类应该只处置它拥有的资源。由于此资源是从外部提供的,因此该类不负责处理它,除非该资源的所有权被“明确”传递给它。传递所有权的这种明确性通常通过文档或使用通用设计模式来完成。例如,工厂方法(名为CreateXXX
)通过返回的实例传递调用者的所有权是很自然的。另一方面,DI容器包含Get
,GetInstance
或Resolve
方法,并且它们不会将所有权传递给调用者。
但除此之外,在您的情况下,您正在处理DI容器。 DI容器实例通常应该在应用程序的整个持续时间内存活。虽然容器通常需要处理,但在此类中调用dispose显然是错误的。这个工厂类不负责这样做。由于容器应在应用期间存活,因此正确的位置是在应用程序拆卸期间。例如,在ASP.NET应用程序中,这通常是global.asax中的Application_End
事件。