2012-12-03 190 views
0

我有以下控制檯程序。但是,屬性服務爲空,並且以下代碼塊中的最後一行會引發異常。我錯過了什麼?使用Unity初始化屬性

class Program 
{ 
    static void Main(string[] args) 
    { 
     container = new UnityContainer(); 
     container.RegisterType<Service.IService, Service.Service>(); 
     container.RegisterType<IC1, C1>(); 
     container.Resolve<Service.IService>(); 
     // var c1 = container.Resolve<IC1>(); 
     c1.Run(); 
    } 

    [Depenency] C1 c1 { get; set; } 
} 

public class C1 
{ 
    [Depenency] Service.IService service { get; set; } 

    public void Run() 
    { 
     var s = service.GetSomething(); // service is null 
+0

你爲什麼要container.Resolve ()的額外調用;在那裏?你正在創建一個對象,只是爲了拋出它。你不需要這樣做,當你解決IC1時,容器會自動做正確的事情 - 一旦你的財產是公開的,就是這樣。 –

+0

@ChrisTavares我已經更新了這個問題。還有什麼我應該改變的更好的做法? – ca9163d9

+0

嗯,現在代碼根本就不會運行,因爲你沒有解決,甚至不再聲明變量c1,而且你也沒有解析程序的一個實例,所以依賴於c1不會得到ST。所以現在你有兩個未解決的屬性,而不是一個。 –

回答

2

屬性必須public被注入。

public class C1 
{ 
    [Dependency] public Service.IService service { get; set; } 
... 
} 

事實上,他們需要一個公共設置者。這工作:

public class C1 
{ 
    [Dependency] public Service.IService service { protected get; set; } 
... 
} 
0

您應該使用UnityContainer.Resolve而不是用new創建對象直接解決依賴

+0

使用靜態方法而不是創建新實例的好處是什麼? – ca9163d9

+1

@NickW直接創建一個新的實例會破壞使用依賴注入容器的整個觀點。使用resolve方法允許容器爲您提供依賴關係。 – Lukazoid

+0

解析不是靜態方法,它是從容器中獲取實例的方式。新運算符本身並不重新使用統一依賴關係,這是Unity的缺點之一 –