国际奥委会容器。注入容器
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 容器一起使用,那为什么可以呢?
虽然技术上可行,但有点 'containerception' 并且会导致大量混乱。我为处理此类事情的容器创建静态工厂 classes。您 class 由容器解析的实例应该只关心它们打算做什么,而不是进一步解析其他实例。
您不应传递对您的 class 的直接引用,因为这会使您的代码依赖于使用的 IOC 容器(此处为 UnityContainer),并使单元测试更加困难。
如果您的 class A 需要多个 C 实例,您应该为这种情况定义一个工厂并将该工厂的一个实例传递给您的 class A。您的真实工厂可以引用 UnityContainer。对于单元测试,您可以模拟接口并将模拟实例传递给您的 class 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();
}
}
}
我想要的:解析对象 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 容器一起使用,那为什么可以呢?
虽然技术上可行,但有点 'containerception' 并且会导致大量混乱。我为处理此类事情的容器创建静态工厂 classes。您 class 由容器解析的实例应该只关心它们打算做什么,而不是进一步解析其他实例。
您不应传递对您的 class 的直接引用,因为这会使您的代码依赖于使用的 IOC 容器(此处为 UnityContainer),并使单元测试更加困难。
如果您的 class A 需要多个 C 实例,您应该为这种情况定义一个工厂并将该工厂的一个实例传递给您的 class A。您的真实工厂可以引用 UnityContainer。对于单元测试,您可以模拟接口并将模拟实例传递给您的 class 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();
}
}
}