據我所知,你有一些課程,比如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>();
燦你解釋一下'當我有classC.Name =「foo」'時,你的意思是什麼? –
我的意思是我有一個運行時的ClassC對象,例如,它是從列表中選擇的。 – kvuong