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

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

我建议您坚持使用工厂。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();