0

次の問題の解き方を教えてください。

私はクラスを持っています:

public class Module
{
   public Module(Uri param1, Uri param2)
   {
   }
}

このタイプは Unity コンテナーに登録されています。

container.RegisterInstance<Uri>("uri1", new Uri("http://sample-1.com"));
container.RegisterInstance<Uri>("uri2", new Uri("http://sample-2.com"));

container.RegisterType<Module>(
       new InjectionConstructor(
             new ResolvedParameter<Uri>("uri1"), 
             new ResolvedParameter<Uri>("uri2")));

このようにして、Uri のさまざまなインスタンスに対するさまざまなコンストラクター パラメーターへの依存関係が構築されます。

モジュールのインスタンスを解決するときに、この値をオーバーライドしたい。

タイプでオーバーライドできます:

container.Resolve<Module>(
             new DependencyOverride(typeof(Uri), new Uri("http://overriden.com")))

また、カストラクタ パラメータでオーバーライドすることもできます。

container.Resolve<Module>(
   new ParameterOverride("param1", new Uri("http://param1.org"))
   new ParameterOverride("param2", new Uri("http://param2.com")))

BUT: タイプ登録の名前に従って、タイプごとにオーバーライドする方法がわかりません。そのため、DependencyOverride には、すべての型をオーバーライドするための追加のパラメーターがなく、名前付き登録を使用できません。

したがって、次のようなものが必要です。

container.Resolve<Module>(
    new DependencyOverride("uri1", typeof(Uri), new Uri("http://overriden-1.com")),
    new DependencyOverride("uri2", typeof(Uri), new Uri("http://overriden-2.com")));

最初のパラメーター (uri1 & uri2) は、最初の登録時に ResolvedParameter("uri1") と ResolvedParameter("uri2") を使用して型を登録するときに依存関係を構築するために使用された名前です。

コンストラクターパラメーターの名前を定義せずに、コンテナーからモジュールを解決するときにオーバーライドする方法を提案してください。

PS なぜこの方法に行きたいのですか? パラメータの名前に依存したくないので、誰かが名前を変更すると、依存関係ツリーが壊れます。また、モジュールがどのように登録されたか、モジュールに複数のコンストラクターがある場合に選択されたコンストラクターの種類に依存したくありません。

UPD: 一時的な解決策を見つけましたが、Module1 と Module2 に依存するコントローラーとは別に Module1 と Module2 を解決しているため、PerResolveLifetimeManager などのライフタイム マネージャーが壊れたため、これは単なる回避策です。

        var m1 = _container.Resolve<IModule1>(
            new DependencyOverride(typeof(HttpControllerContext), context),
            new DependencyOverride(typeof(Uri), new Uri("http://module-1.com/")));

        var m2 = _container.Resolve<IModule2>(
            new DependencyOverride(typeof(HttpControllerContext), context),
            new DependencyOverride(typeof(Uri), new Uri("http://m-2.com/")));

        var dependency = new ResolverOverride[] 
        {
            new DependencyOverride(typeof(HttpControllerContext), context),
            new DependencyOverride(typeof(IModule1), m1),
            new DependencyOverride(typeof(IModule2), m2)
        };

        var controller = _container.Resolve(controllerType, dependency) as IHttpController;
        return controller;
4

1 に答える 1

0

子コンテナを試しましたか?それ以外の

container.Resolve<Module>(
    new DependencyOverride("uri1", typeof(Uri), new Uri("http://overriden-1.com")),
    new DependencyOverride("uri2", typeof(Uri), new Uri("http://overriden-2.com")));

URI を使用して子コンテナーを作成し、モジュールを解決できるようにすることができます。

container.CreateChildContainer()
    .RegisterInstance<Uri>("uri1", new Uri("http://overriden-1.com"))
    .RegisterInstance<Uri>("uri2", new Uri("http://overriden-2.com"))
    .Resolve<Module>();
于 2012-07-24T14:34:52.510 に答える