C#Unity-动态解析注册类型

C#Unity-动态解析注册类型,c#,dependency-injection,inversion-of-control,unity-container,C#,Dependency Injection,Inversion Of Control,Unity Container,我有一个场景,我们正在接收xml消息。我需要查看消息的标题以确定它是什么消息类型/版本(来自遗留系统)。我希望能够注册消息类型,然后传入一个参数来解析特定类型。我是DI/Unity的新手(如果您没有注意到的话),所以我可能试图应用一个不好的实践,或者错误地处理这个问题。我们想从现有的工厂模式中走一条路来实现这一点 这显然有效: XDocument xml = XDocument.Load(@"D:\Demos\XmlMessages\AllMessages\LogEvent.xml");

我有一个场景,我们正在接收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();
//基础工程
RegisterType(新的InjectionProperty(“XmlDoc”,xml));
var baseMessage=container.Resolve();
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
XDocument xml=XDocument.Load(@“D:\Demos\XmlMessages\AllMessages\LogEvent.xml”);
var container=new UnityContainer();
RegisterType(“LogEvent”,newinjectionProperty(“XmlDoc”,xml));
var baseMessage=container.Resolve(typeof(IMessage),“LogEvent”);
baseMessage.ParseDocument()//只是返回类型,所以显然无法运行此
注册我的邮件是正确的方法吗?如果是这样的话,那么我如何完成对BaseMessage的解析,以便调用ParseDocument

非常感谢您提供的任何信息/建议

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

谢谢


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

您可以将工厂注入那些需要处理传入消息的类中,但不要试图将确定如何处理XML的逻辑放入容器中


更新

如果您已经有了获取消息对象的具体类型的机制,那么您可以使用对Activator.CreateInstance的简单调用来完全忽略Unity

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

object msg = container.Resolve(typeof(LogEvent));
此方法返回一个
对象
。如果知道将获得某个基类的实例,则可以将其强制转换为该
类型


如果消息
Type
是一个具体的类(而不是接口或抽象类),Unity将找出如何创建该
类型的实例

以下是我必须做的来解决问题。这是有效的:

获取Xml并定义容器:

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

container.RegisterType<IMessage, LogEvent>("LogEvent", new InjectionProperty("XmlDoc", xml));
container.RegisterType(“LogEvent”,newinjectionProperty(“XmlDoc”,xml));
按注册名称解析(下面的解析部分是我做错的地方)

var baseMessage=container.Resolve(“LogEvent”);
baseMessage.ParseDocument();

Thank@SebastianWeber…。请看我的编辑。我只是想获取您的输入。实际上,我正在使用反射调用“Activator.CreateInstance”。我将看一看上面的对象示例。谢谢Sebastion。您可能会发现这与此相关:
  var baseMessage = container.Resolve<IMessage>("LogEvent");
    baseMessage.ParseDocument();