web-dev-qa-db-ja.com

静的ファクトリメソッドを使用してオブジェクトを作成する方法

Unityがクラスのコンストラクターを使用してクラスのインスタンスを作成するように構成できることを知っていますが(以下のように)、それは私が望むものではありません。

_container.RegisterType<IAuthoringRepository, AuthoringRepository>();
_

IAuthoringRepositoryのタイプを解決するときに、パラメーターとして渡されたWindows IDを使用してファクトリメソッドを使用するようにUnityを構成したい(つまり:RepositoryFactory.CreateAuthoringRepository(WindowsIdentity.GetCurrent()))。どうすればよいですか?

32
burnt1ce

1つの方法は、RepositoryFactoryにIRepositoryFactoryを実装させ、それを登録することです。解決された型はファクトリを取得し、そのCreateAuthoringRepositoryメソッドを呼び出すことができます。必要に応じて、CreateAuthoringRepositoryForCurrentIdentityという名前のオーバーロードを作成するか、ファクトリのIIdentity依存関係をUnityに登録できます。

おそらく、ファクトリをインジェクトし、CreateAuthoringRepositoryメソッドをそのままにして、クライアントにWindowsIdentity.GetCurrent()を渡させます。このようにして、IDは常に新鮮であり、テストのためにファクトリーを模擬できます。

または、InjectionFactoryを使用してデリゲートを指定できます。

void Main()
{
    using (var container = new UnityContainer())
    {
        container.RegisterType<IAuthoringRepository>(
            new InjectionFactory(c => CreateAuthoringRepository()));

        Console.WriteLine("debug - resolving model");
        var model = container.Resolve<Model>();
    }
}

public IAuthoringRepository CreateAuthoringRepository()
{
    Console.WriteLine("debug - calling factory");
    return new AuthoringRepository
        { Identity = WindowsIdentity.GetCurrent() };
}

public class Model
{
    public Model(IAuthoringRepository repository)
    {
        Console.WriteLine(
            "Constructing model with repository identity of "
            + repository.Identity);
    }
}

public interface IAuthoringRepository
{
    IIdentity Identity { get; }
}

public class AuthoringRepository : IAuthoringRepository
{
    public IIdentity Identity { get; set; }
}

これは印刷します:

デバッグ-モデルの解決
デバッグ-ファクトリの呼び出し
 System.Security.Principal.WindowsIdentityのリポジトリIDを使用したモデルの構築

Unity 2.0の場合です。以前のバージョンでは、 StaticFactoryExtension を参照してください。

49
TrueWill

現在、メソッドInjectionFactoryは廃止されています。そのため、メソッドRegisterFactoryを使用する方が良いでしょう。以下は、前のコードがどのように変更されたかを示しています。どのように見えるか、メソッドCreateAuthoringRepositoryを変更しました。これが静的メソッドで、パラメータが1つIUnityContainerコンテナです。

void Main()
{
    using (var container = new UnityContainer())
    {
        container.RegisterFactory<IAuthoringRepository>(CreateAuthoringRepository);

        Console.WriteLine("debug - resolving model");
        var model = container.Resolve<Model>();
    }
}

public static IAuthoringRepository CreateAuthoringRepository(IUnityContainer container)
{
    Console.WriteLine("debug - calling factory");
    return new AuthoringRepository
        { Identity = WindowsIdentity.GetCurrent() };
}

public class Model
{
    public Model(IAuthoringRepository repository)
    {
        Console.WriteLine(
            "Constructing model with repository identity of "
            + repository.Identity);
    }
}

public interface IAuthoringRepository
{
    IIdentity Identity { get; }
}

public class AuthoringRepository : IAuthoringRepository
{
    public IIdentity Identity { get; set; }
}
0