![](/img/trans.png)
[英]Is There a Way to Inject A Dependency to a Helper Class Using IoC Container?
[英]IoC Container. Inject container
我想要的是:解析對象A,並且在對象A內,我想使用相同的容器來解析對象C:
public static void Work()
{
IUnityContainer con = new UnityContainer();
con.RegisterType<IA, A>();
con.RegisterType<IB, B>();
con.RegisterType<IC, C>();
var a = con.Resolve<IA>();
}
interface IA { }
interface IB { }
interface IC { }
class A : IA
{
public A(IB b, IUnityContainer con)
{
for (int i = 0; i < 10; i++)
{
var c = con.Resolve<IC>();
}
}
}
class B : IB { };
class C : IC { };
問題:在許多站點上,我看到注入容器不是一個好主意,但是在這種情況下又該如何呢?
編輯1
服務定位器是一種反模式。 因此,如果可以將服務定位器與IoC容器一起使用,為什么還可以呢?
您不應傳遞對類的直接引用,因為這將使您的代碼依賴於使用的IOC容器(在此為UnityContainer),並使單元測試更加困難。
如果您的類A需要多個C實例,則應為此情況定義一個工廠,並將該工廠的實例傳遞給您的類A。您的真實工廠可以引用UnityContainer。 對於單元測試,您可以模擬接口並將模擬的實例傳遞給類A。
這樣的代碼看起來像這樣。
public interface IClassICFactory
{
IC CreateInstance();
}
public class ClassICUnityContainerFactory : IClassCFactory
{
private IUnityContainer _container;
public ClassICUnityContainerFactory(IUnityContainer container)
{
_container = container;
}
public IC CreateInstance()
{
return _container.Resolve<C>();
}
}
class A : IA
{
public A(IB b, IClassICFactory factory)
{
for (int i = 0; i < 10; i++)
{
var c = factory.CreateInstance();
}
}
}
從技術上講,它雖然有效,但卻有點“容器化”,並且會導致大量混亂。 我為處理此類問題的容器創建靜態工廠類。 容器解析的類實例應該只關心它們打算做什么,而不是進一步解析其他實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.