C# 温莎城堡代码回顾
我在一个工厂类中使用Castle.Windsor来创建所需类的实例。 您可以在下面找到示例C# 温莎城堡代码回顾,c#,.net,dependency-injection,inversion-of-control,castle-windsor,C#,.net,Dependency Injection,Inversion Of Control,Castle Windsor,我在一个工厂类中使用Castle.Windsor来创建所需类的实例。 您可以在下面找到示例 public class MyFactory : IDisposable { protected readonly IKernel Kernel; protected MyFactory(IKernel kernel) { Contract.Requires<ArgumentNullException>( kernel.NotN
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();
}
}
公共类MyFactory:IDisposable
{
受保护的只读IKernel内核;
受保护的MyFactory(IKernel内核)
{
合同。需要(
kernel.NotNull(),
“'kernel'参数必须初始化。”);
内核=内核;
}
公共IMyType Create(长参数1,长参数2)
{
返回内核(
新的{numberOfRows,numberOfCells});
}
公共空间处置()
{
DisposeManagedResources();
}
受保护的虚拟void DisposeManagedResources()
{
Dispose();
}
}
提前感谢。一般来说,类应该只处理它拥有的资源。由于此资源是从外部提供的,因此该类不负责处理它,除非该资源的所有权随它“显式”传递。这种传递所有权的明确性通常通过文档或使用公共设计模式来实现。例如,一个工厂方法(名为
CreateXXX
)将所有权与返回的实例一起传递给调用方是很自然的。另一方面,DI容器包含Get
、GetInstance
或Resolve
方法,它们不会将所有权传递给调用方
但除此之外,在您的例子中,您正在处理一个DI容器。DI容器实例通常应该在应用程序的整个持续时间内都有效。尽管容器通常需要处理,但在此类中调用dispose显然是错误的。这不是该工厂类别的责任。因为容器应该在应用程序的整个过程中都有效,所以正确的位置是在应用程序拆卸期间。例如,在ASP.NET应用程序中,这通常是global.asax.Hmm.中的
application\u End
事件。。我想ServiceLocator可以帮我…你为什么这么做?我的工厂用在哪里?非常感谢。我决定使用CommonServiceLocator.WindsorAdapter类。”MyFactory的类还不是必需的-ServiceLocator.Current.GetInstance()应创建所需类的新实例。只是我找不到如何使用参数构造函数。。。可能是参数的延迟初始化…不要使用公共服务定位器。应用程序不应直接或通过公共服务定位器接口调用容器。很清楚地解释了为什么。嗯。。。“可怕的开发者体验”。。。但我的工厂不会直接依赖于容器。。。好的,没问题,当我的工厂类包含IKernel属性以创建新实例时,这是一个很好的实践吗?@MaximPolishchuk:诀窍是通过依赖注入(特别是构造函数注入)使应用程序代码独立于所用的容器。基础设施代码(作为应用程序启动路径的一部分,在该路径中连接依赖项)可以对容器产生依赖性,而不存在任何风险。换句话说,将工厂抽象放在应用程序中,而将工厂实现放在应用程序启动代码中。