C#Unity - 动态解决已注册的类型

时间:2012-01-25 16:53:33

标签: c# dependency-injection inversion-of-control unity-container

我有一个我们在xml消息中接收的场景。我需要查看消息的标题以确定它是什么消息类型/版本(来自遗留系统)。我希望能够注册消息类型然后传入一个参数来解析特定的类型。我是DI / Unity的新手(如果你没有注意到的话),所以我可能会尝试应用不好的做法或不正确地接近这个。想要从我们正在使用的现有工厂模式中移开一条路来实现这一目标。

这显然有效:

    XDocument xml = XDocument.Load(@"D:\Demos\XmlMessages\AllMessages\LogEvent.xml");
    var container = new UnityContainer();

    //Base Works
    container.RegisterType<IMessage, LogEvent>(new InjectionProperty("XmlDoc", xml));
    var baseMessage = container.Resolve<BaseMessage>();
    baseMessage.ParseDocument();

不确定如何在此处应用动态分辨率?:

XDocument xml = XDocument.Load(@"D:\Demos\XmlMessages\AllMessages\LogEvent.xml");
var container = new UnityContainer();
    container.RegisterType<IMessage, LogEvent>("LogEvent", new InjectionProperty("XmlDoc", xml));
    var baseMessage = container.Resolve(typeof(IMessage), "LogEvent");

    baseMessage.ParseDocument(); //Just returning type so obviously can't run this

正在以正确的方式注册我的消息吗?如果是,那么我怎样才能完成对我的BaseMessage的解析,以便我可以调用ParseDocument?

非常感谢任何信息/建议。

修改 我已经有一个类将解析XML的标头并提供我的版本和类型(例如,它会告诉我这是一个“LogEvent”消息)。这就是我考虑使用DI的原因,我可以简单地将解析后的值(在本例中为“LogEvent”)传递给解析器。只是想根据Sebastian的响应进行更新。即使这种情况不适用,我也应该坚持使用工厂方法。我想了解这种动态调用是如何实现的。

谢谢,

取值

2 个答案:

答案 0 :(得分:2)

我建议你坚持工厂。 DI容器不是业务对象的工厂,而是一种可以帮助您组合松散耦合的应用程序的工具。

您可以将工厂注入需要处理传入消息的类中。但是,不要试图将弄清楚如何处理XML的逻辑放入容器中。


<强>更新

如果您已有机制获取消息对象的具体Type,则可以使用对Activator.CreateInstance的简单调用并完全忽略Unity。

或者,假设您有一个可用的容器实例,请致电

object msg = container.Resolve(typeof(LogEvent));

此方法返回object。如果您知道将获得某个基类的实例,则可以将其强制转换为Type

如果消息Type是具体类(不是接口或抽象类),Unity将弄清楚如何创建Type的实例。

答案 1 :(得分:0)

以下是我必须采取的措施来解决这个问题。这有效:

获取Xml并定义容器:

XDocument xml = XDocument.Load(@"D:\Demos\XmlMessages\AllMessages\LogEvent.xml");
var container = new UnityContainer();

寄存器:

container.RegisterType<IMessage, LogEvent>("LogEvent", new InjectionProperty("XmlDoc", xml));

按注册名称解析(以下解决部分是我做错了)

  var baseMessage = container.Resolve<IMessage>("LogEvent");
    baseMessage.ParseDocument();
相关问题