0
名爲依賴

請建議我如何解決以下問題:如何覆蓋在Unity

我有一個類:

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

這種類型的註冊在統一容器:

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的不同實例。

我想在解析Module的實例時覆蓋此值。

我可以通過重寫類型:

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

我也可以通過custructor參數重寫。

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

但是:我不知道如何根據類型註冊的名稱進行重寫。 因此,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」)進行初始註冊。

請建議我,如何在從容器中解析Module而不定義構造函數參數的名稱時重寫。

P.S.我爲什麼要這樣去? 因爲我不想依賴於參數的名稱,所以有人可以重命名它們,並且依賴關係樹會被破壞。另外,我不希望依賴於Module如何註冊,如果Module有多個構造函數,選擇了哪種構造函數。我發現暫時的解決方案,但它只是解決方法,因爲它打破了生命週期管理器,例如PerResolveLifetimeManager,因爲我們正在解決Module1和Module2與控制器分開的問題,它們依賴於Module1和Module2。

 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; 
+0

什麼改變的配置值或「URI1」,而不是與衍生物工作ResolverOverride的? – 2012-07-19 12:49:50

+0

當然,我可以,但它不能幫助我解決如何重寫構造函數參數而不依賴於構造函數參數名稱的問題。我只想按類型覆蓋。但是,你建議我另一種方法來解決這個問題。如果它有幫助,我會寫回應我是如何做到的。 – 2012-07-19 13:03:05

+0

我甚至建議你不要在你的應用程序代碼中的任何地方調用組合根之外的容器,以保持誠實...你會介意分享一些代碼,告訴你如何以及在哪裏以你的方式調用容器如上所述? – 2012-07-19 13:32:27

回答

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>();