Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 温莎城堡代码回顾_C#_.net_Dependency Injection_Inversion Of Control_Castle Windsor - Fatal编程技术网

C# 温莎城堡代码回顾

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

我在一个工厂类中使用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();
    }
}
公共类MyFactory:IDisposable
{
受保护的只读IKernel内核;
受保护的MyFactory(IKernel内核)
{
合同。需要(
kernel.NotNull(),
“'kernel'参数必须初始化。”);
内核=内核;
}
公共IMyType Create(长参数1,长参数2)
{
返回内核(
新的{numberOfRows,numberOfCells});
}
公共空间处置()
{
DisposeManagedResources();
}
受保护的虚拟void DisposeManagedResources()
{
Dispose();
}
}
  • 我不确定我在这里是否需要IDisposable。。。我应该在处理MyFactory实例之后立即处理内核吗
  • 我不确定IKernel(在构造函数中)是否是在Create方法中解析IMyType的最佳方法。我想,有人可以建议一个更优雅的版本:)
  • 还有其他想法吗


    提前感谢。

    一般来说,类应该只处理它拥有的资源。由于此资源是从外部提供的,因此该类不负责处理它,除非该资源的所有权随它“显式”传递。这种传递所有权的明确性通常通过文档或使用公共设计模式来实现。例如,一个工厂方法(名为
    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:诀窍是通过依赖注入(特别是构造函数注入)使应用程序代码独立于所用的容器。基础设施代码(作为应用程序启动路径的一部分,在该路径中连接依赖项)可以对容器产生依赖性,而不存在任何风险。换句话说,将工厂抽象放在应用程序中,而将工厂实现放在应用程序启动代码中。