C#Unity-动态解析注册类型
本文关键字:注册 类型 动态 C#Unity- | 更新日期: 2023-09-27 18:21:29
我有一个场景,我们在其中接收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")传递给Resolver。我只想根据Sebastian的响应进行更新。即使这种情况不适用,我也应该坚持工厂方法。我想了解这种类型的动态调用是如何可能的。
谢谢,
S
我建议您坚持使用工厂。DI容器不是业务对象的工厂,而是帮助您构建松散耦合应用程序的工具。
您可以将工厂注入到那些需要处理传入消息的类中。但是,不要试图将确定如何处理XML的逻辑放入容器中。
更新
如果您已经有了获取消息对象的具体Type
的机制,那么您可以使用对Activator.CreateInstance
的简单调用并完全忽略Unity。
或者,假设您有可用的容器实例,则调用
object msg = container.Resolve(typeof(LogEvent));
此方法返回一个object
。如果您知道您将获得某个基类的实例,则可以将其强制转换为Type
。
如果消息Type
是一个具体类(而不是接口或抽象类),Unity将找出如何创建该Type
的实例。
以下是我为解决此问题所做的操作。这项工作:
获取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();