2012-04-22 46 views
9

注入依賴屬性我有以下類別:如何使用Ioc的團結

public interface IServiceA 
{ 
    string MethodA1(); 
} 

public interface IServiceB 
{ 
    string MethodB1(); 
} 

public class ServiceA : IServiceA 
{ 
    public IServiceB serviceB; 

    public string MethodA1() 
    { 
     return "MethodA1() " +serviceB.MethodB1(); 
    } 
} 

public class ServiceB : IServiceB 
{ 
    public string MethodB1() 
    { 
     return "MethodB1() "; 
    } 
} 

我使用統一的IoC的,我的註冊看起來像這樣:

container.RegisterType<IServiceA, ServiceA>(); 
container.RegisterType<IServiceB, ServiceB>(); 

當我解決ServiceA例如, serviceB將是null。 我該如何解決這個問題?

回答

14

您至少有兩個選項:

可以/應該使用構造函數注射,你需要一個構造函數:

public class ServiceA : IServiceA 
{ 
    private IServiceB serviceB; 

    public ServiceA(IServiceB serviceB) 
    { 
     this.serviceB = serviceB; 
    } 

    public string MethodA1() 
    { 
     return "MethodA1() " +serviceB.MethodB1(); 
    } 
} 

或Unity支持財產注射,你需要的屬性和DependencyAttribute

public class ServiceA : IServiceA 
{ 
    [Dependency] 
    public IServiceB ServiceB { get; set; }; 

    public string MethodA1() 
    { 
     return "MethodA1() " +serviceB.MethodB1(); 
    } 
} 

MSDN網站What Does Unity Do?是團結的良好起點。

+6

如果你有構造函數和屬性注入的選擇,我認爲你應該選擇構造函數注入。屬性注入將使類依賴於統一或某些其他調用者'記住'他們需要提供該依賴關係。構造函數注入使任何試圖使用該類的依賴對於該類都至關重要的人都清楚。 – Carlos 2012-04-23 16:40:56

+0

如果類有多個依賴項,那麼在某些調用中並不需要這些依賴項?他們都會被實例化嗎?或者它們只會在被訪問時才被實例化,如上所示:serviceB.method()? @Carlos – Legends 2015-04-12 14:10:02

+1

@Legends當你創建了ServiceA時,即使你沒有在你的所有方法中使用它們,你的所有依賴關係也將被設置並注入。 Unity不支持開箱即用的懶惰實例化,但可以將其作爲擴展添加:http://pwlodek.blogspot.hu/2010/05/lazy-and-ienumerable-support-comes-to.html – nemesv 2015-04-12 16:26:09