2015-12-24 275 views
1

我是Unity新手。我有3類這樣重寫依賴關係鏈

ClassA(ClassB b) 
ClassB(ClassC c) 
public class ClassC 
{ 
    public string Name { get; set; } 
} 

而當運行時我有classC.Name = "foo",我的問題是如何使用classC我解決<ClassA>?我是否應該創建工廠方法以首先使用ClassC來解析ClassB,然後使用ClassB解析ClassA

有沒有更好的方法?

+1

燦你解釋一下'當我有classC.Name =「foo」'時,你的意思是什麼? –

+0

我的意思是我有一個運行時的ClassC對象,例如,它是從列表中選擇的。 – kvuong

回答

2

據我所知,你有一些課程,比如ClientClass,需要創建一個ClassA的實例,給定一個ClassC的實例。

例如:

public class ClientClass 
{ 
    public void SomeMethod() 
    { 
     ClassC class_c = ... 
     ClassA class_a = CreateClassA(class_c); 
    } 
} 

那麼這是什麼意思是,ClientClass需要的依賴,看起來像這樣:

public interface IClassAFactory 
{ 
    ClassA Create(ClassC class_c); 
} 

這種關係稱爲一個工廠,它允許您創建其他依賴。

現在,在你決定你需要一個工廠之前,看看你是否能滿足你的要求沒有一個。看看this article

如果您決定需要工廠,請在需要它的同一裝配中定義上述接口(其中ClientClass住在此處)。

然後你需要創建一個這樣的工廠的實現,它使用容器來創建ClassA對象。

這裏有一個這樣的工廠的樣子:

public class UnityBasedClassAFactory : IClassAFactory 
{ 
    private readonly IUnityContainer m_Container; 

    public UnityBasedClassAFactory(IUnityContainer container) 
    { 
     m_Container = container; 
    } 

    public ClassA Create(ClassC class_c) 
    { 
     return m_Container.Resolve<ClassA>(new DependencyOverride<ClassC>(class_c)); 
    } 
} 

請注意,這個工廠類需要在Composition Root存在。如果你在其他地方創建它,這意味着你正在使用Service Locator anti-pattern

現在,你需要注入工廠接口到ClientClass這樣的:

public class ClientClass 
{ 
    private readonly IClassAFactory m_ClassAFactory; 

    public ClientClass(IClassAFactory class_a_factory) 
    { 
     m_ClassAFactory = class_a_factory; 
    } 

    public void SomeMethod() 
    { 
     ClassC class_c = ...; //runtime value 
     ClassA class_a = m_ClassAFactory.Create(class_c); 
    } 
} 

現在,所有你需要做的是在你的組合根註冊的工廠是這樣的:

container.RegisterType<IClassAFactory, UnityBasedClassAFactory>(); 
+0

感謝您的鏈接,其實這一個解決我的問題 '新DependencyOverride (class_c)' 不知道它可以在鏈覆蓋PARAMS。 – kvuong

+0

嗨雅各布,我得需要工廠現在,我將適用於您的解決方案,另一種情況,但我的問題是:通過容器UnityBasedClassAFactory正確的方式? – kvuong

+0

@ kvuong,只要工廠生活在構圖根。 –