【发布时间】:2016-12-15 17:52:48
【问题描述】:
我正在研究统一容器,并有一个关于如何将类的构造解析为接口的多个不同实现的问题。
这是我的代码:
public interface IRenderer
{
void DrawSquare(Square square);
void DrawCircle(Circle circle);
}
public interface IShape
{
void Draw(IRenderer renderer);
}
public class Dx11Renderer : IRenderer
{
public void DrawSquare(Square square)
{
}
public void DrawCircle(Circle circle)
{
}
}
public class GlRenderer : IRenderer
{
public void DrawSquare(Square square)
{
}
public void DrawCircle(Circle circle)
{
}
}
public class Circle : IShape
{
public void Draw(IRenderer renderer) { renderer.DrawCircle(this); }
}
public class Square
{
public void Draw(IRenderer renderer) { renderer.DrawSquare(this); }
}
public class Canvas
{
private readonly IRenderer _renderer;
private List<Circle> _circles = new List<Circle>();
private List<Square> _squares = new List<Square>();
public Canvas(IRenderer renderer)
{
_renderer = renderer;
}
public void Draw()
{
foreach (Circle c in _circles)
{
c.Draw(_renderer);
}
foreach (Square s in _squares)
{
s.Draw(_renderer);
}
}
}
并注册/解决
// Create the container
var container = new UnityContainer();
// registration
container.RegisterType<IRenderer, GlRenderer>("GL");
container.RegisterType<IRenderer, Dx11Renderer>("DX11");
Canvas canvas = container.Resolve<Canvas>("GL");
这会引发“ResolutionFailedException”,所以我一定是错误地使用了它。
有人可以解释这是否是不好的做法,或者我如何实现这一点。
谢谢
更新:
所以我所做的是使用每种类型的依赖项注册 Canvas 两次,如下所示:
// Canvas with an OpenGL Renderer
container.RegisterType<Canvas>("GLCanvas", new InjectionConstructor(new ResolvedParameter<IRenderer>("GL")));
// Canvas with a DirectX Renderer
container.RegisterType<Canvas>("DXCanvas", new InjectionConstructor(new ResolvedParameter<IRenderer>("DX11")));
Canvas canvas = container.Resolve<Canvas>("GLCanvas");
这对我很有效!
【问题讨论】:
-
Canvas canvas = container.Resolve
-
见Dependency injection type-selection 和Dependency Injection Unity - Conditional resolving。 DI 容器用于在应用程序启动时解析对象图,而不是用于控制运行时行为。如果是后者,您应该使用一个或多个design patterns 来解决问题,因为这显然不是 DI 问题,而是应用程序设计问题。
标签: c# .net unity-container