2009-09-02 31 views
3
當我 一切正常,所有依賴屬性註釋: 通過容器解析。 但是,我現在有一個int屬性,我也想通過容器解析。它不是在構造函數中傳遞的,而是作爲公共屬性傳遞的。所以我嘗試了這個: 現在該屬性被注入,但所有其他使用[Dependency]註釋的屬性爲null且未解析。如果我將InjectionProperty用於一個屬性,我現在是否必須顯式聲明具有[Dependency]屬性的所有其他屬性?或者有更好的方法嗎? 謝謝。

回答

1

通過API(運行時)註冊屬性將取消[Dependency]屬性。 你不能同時使用兩者。但是你可以使用反射來獲取用[Dependency]屬性裝飾的屬性,並在運行時註冊它們。

6

雖然@najmeddine是正確的,但您仍然可以執行以下操作。

你的組件:

public class Service : IService 
{ 
    [Dependency("Key")] 
    public Int32 Value { get; set; } 
} 

報名:

IUnityContainer unity = new UnityContainer() 
    .RegisterType<IService, Service>() 
    .RegisterInstance("Key", 2010) 

用法很簡單。

如果你現在使用統一2.0或更高版本(這是不適用於你)如果你需要注入你的應用程序在不同的地區不同的值(限界上下文),使用容器層次:

IUnityContainer child = unity.CreateChildContainer() 
    .RegisterInstance("Key", 1900); 

並解決你的組件在child Unity容器。

更多關於容器層次: http://msdn.microsoft.com/en-us/library/ff660895(PandP.20).aspx

0

正如najmeddine表示,InjectionProperty註冊覆蓋[Dependency]屬性...你可以,但是,仍然使用InjectionMethod對象不會覆蓋[Dependency]屬性。

我建立了我與可選的 「覆蓋」 方法的對象:

class SomeObject 
{ 
    [Dependency("Value")] 
    public string Value { get; set; } 

    public void OverrideValue(string value) 
    { 
     this.Value = value; 
    } 
} 

普通DI將工作如下:

container.RegisterInstance<string>("Value", "Default Value"); 

container.Resolve<SomeObject>(); 

隨着覆蓋的值,你會做以下幾點:

container.RegisterType<SomeObject>("NotDefault", new InjectionMethod("OverrideValue", "Other Value")); 

container.Resolve<SomeObject>("NotDefault"); 

我剛剛寫下了我的頭頂,所以我提前爲任何錯別字道歉。 (如果您發現任何內容,只需發表評論,我會很樂意調整我的答案。)