1

統一された名前付き依存関係を作成して、別の解決パスに従う方法がわかりません。だから私が持っているなら

public interface IService
{
    SomeMethod();
}

public class Service : IService
{
    private readonly IRepository repository;
    public Service(IRepository repository)
    {
    this.repository = repository;
    }
    public SomeMethod 
    { 
        //some implementation here
    }
}

そしてその下にリポジトリがあります:IRepository、NHibernateContext:INHibernateContext、ISessionなど。

私の質問は、Global.asax で次に行うかどうかです。

container.RegisterType<IService, Service>("GlobalContext");

次に、「GlobalContext」パス内に NHibernateContext (またはその他の階層依存関係) を (デフォルトの登録済みタイプを使用せずに) 挿入するにはどうすればよいですか?

大変助かりました。

4

2 に答える 2

2

このように名前付き登録を使用する場合、自動配線に頼ることができなくなるため、登録をより具体的にする必要があります。したがって、これらがあると仮定します:

container.RegisterType<INHibernateContext, NHibernateContext>("GlobalContext");
container.RegisterType<ISession, NHibernateSession>("GlobalContext");

IRepository、「GlobalContext」を解決するときに、これらの特定の依存関係を注入する必要があります。これら 2 つのパラメーターを受け取るコンストラクターがあると仮定すると、使用する名前をコンテナーに明示的に伝えます。

container.RegisterType<IRepository, Repository>("GlobalContext",
    new InjectionConstructor(
        new ResolvedParameter<INHibernateContext>("GlobalContext"),
        new ResolvedParameter<ISession>("GlobalContext")
    )
);

これにより、INHibernateContext と ISession を受け取るコンストラクターを使用し、コンテナーを介してこれらのパラメーターを解決し、解決時に GlobalContext 名を使用するようコンテナーに指示します。

同様に、サービスを接続するには:

container.RegisterType<IService, Service>("GlobalContext",
    new ResolvedParameter<IRepository>("GlobalContext")
);

そして最後の解決呼び出し:

container.Resolve<IService>("GlobalContext");

オブジェクトグラフを希望どおりに構築する必要があります。

于 2013-08-14T21:16:53.300 に答える
0

しばらくして、他のプロジェクトでも同様のニーズがありましたが、Castle Windsor を使用していました。私が今行う方法では、一部のアプリケーション パスで別の依存関係の解決が必要な場合、子コンテナーを使用します。

  1. 子コンテナを作成し、解像度の異なる依存関係を登録する
  2. 子コンテナ自体を名前付きインスタンスとして登録します。
  3. エントリ ポイント (私の場合はコントローラー ファクトリ) で、親コンテナーまたは子を介して解決する必要があるかどうかを確認します。必要に応じて、子コンテナーを解決し、それを使用して階層チェーンを解決します。子コンテナーに登録が存在しない場合は、親の依存関係リゾルバーが使用されます。
于 2014-11-21T10:36:36.027 に答える