4

Unityコンテナに挿入する以下のようなインターフェースがあります。

public interface IMyInstanceFactory
{
    IEnumerable<IMyInstance> GetAll();
}

すべてIMyInstanceが実行前に認識されます。つまり、ブートストラップ内でセットアップでき、ユニティから取得できます。私の具体的な実装IMyInstanceFactoryは次のとおりです。

public class MyInstanceFactory:IMyInstanceFactory
{
    IUnityContainer _container;

    public MyInstanceFactory(IUnityContainer container)
    {
        _container = container;
    }
    public IEnumerable<IMyInstance> GetAll()
    {
        return _container.ResolveAll<IMyInstance>();
    }
}

..そして私のブートストラップで私はこのようなことをします:

container.RegisterType<IMyInstance,MyInstance1>;
container.RegisterType<IMyInstance,MyInstance2>;
container.RegisterType<IMyInstance,MyInstance3>;
container.RegisterType<IMyInstanceFactory,MyInstanceFactory>;

これにより、すべてが美しく解決されます。ただし、コンテナー自体に依存したり、このためだけに実装したりしたくありません。IMyInstanceFactory実装せずにこれを設定する方法はありIMyInstanceFactoryますか? Unity はこの機能を提供していますか?

このようなもの..

container.RegisterType<IMyInstanceFactory,factory=>factory.GetAll()>().IsResolvedBy(unity.ResolveAll<IMyInstance>);

城がこれを行うことができることは知っていますが、Unity は同様のことを行うことができますか?

4

2 に答える 2

3

Castle Windsor Typed Factory Facilities for Unity のポートがあります。インターフェイスの実装を生成し、あなたのResolveAllために行います。

ブートストラップ コードは次のようになります。

container.RegisterType<IMyInstance,MyInstance1>("1");
container.RegisterType<IMyInstance,MyInstance2>("2");
container.RegisterType<IMyInstance,MyInstance3>("3");
container.RegisterType<IMyInstanceFactory>(new TypedFactory());

への呼び出しGetAllは、コンテナ呼び出しに変換されますResolveAll

ポートは、Windsor で説明されているのと同じ規則に従います。

于 2012-12-06T20:42:18.740 に答える
0

コンテナをファクトリに渡すことに問題はありません。インスタンスを取得するためにコンテナを再度渡す必要がないように、ファクトリがシングルトンとして公開されている場合、これはうまく機能します。

ロケーターはシングルトンであるため、このアプローチは前者に似ています。

于 2012-12-06T18:50:33.880 に答える