我想要的:解析对象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 Container一起使用,为什么还可以呢?
答案 0 :(得分:3)
您不应该直接引用您的类,因为这将使您的代码依赖于使用的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();
}
}
}
答案 1 :(得分:0)
虽然从技术上讲它是有效的,但它有点像容器#39;并会导致巨大的混乱。我为处理这种事情的容器创建了静态工厂类。容器解析的类实例应该只关注它们应该做什么,而不是进一步解析其他实例。