C#Unity-动态解析注册类型
我有一个场景,我们正在接收xml消息。我需要查看消息的标题以确定它是什么消息类型/版本(来自遗留系统)。我希望能够注册消息类型,然后传入一个参数来解析特定类型。我是DI/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");
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();