0

1 つのファクトリ クラスで 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 インスタンスを破棄した直後に Kernel を破棄する必要がありますか?
  2. IKernel (コンストラクター内) が Create メソッドで IMyType を解決するための最良の方法であるかどうかはわかりません。私は、誰かがよりエレガントなバージョンを提案できると思います:)

他のアイデアはありますか?

よろしくお願いします。

4

1 に答える 1

1

原則として、クラスはそれが所有するリソースのみを破棄する必要があります。このリソースは外部から提供されるため、そのリソースの所有権が「明示的に」渡されない限り、そのクラスはそれを破棄する責任を負いません。所有権を渡すこの明示性は、通常、ドキュメントを通じて、または共通の設計パターンを使用して行われます。CreateXXXたとえば、ファクトリ メソッド ( という名前) が、返されたインスタンスで所有権を呼び出し元に渡すことは非常に自然です。一方、DI コンテナーには、、、またはメソッドが含まれてGetおりGetInstanceResolve呼び出し元に所有権を渡しません。

しかし、これに加えて、あなたの場合、DIコンテナを扱っています。通常、DI コンテナー インスタンスは、アプリケーションの合計期間中存続する必要があります。コンテナーは通常破棄する必要がありますが、このクラス内で dispose を呼び出すのは明らかに不適切です。そうすることは、このファクトリ クラスの責任ではありません。コンテナはアプリケーションの期間中存続する必要があるため、アプリケーションのティアダウン中が正しい場所です。たとえば、ASP.NET アプリケーションでは、これは通常Application_End、global.asax 内のイベントになります。

于 2012-10-29T10:06:27.083 に答える