我有一个从代码配置的工作 Unity 容器。我必须转到 xml 配置,但无法正确配置。我不知道我错过了什么 - 也许有人知道解决方案并且可以帮助我!

我的解决方案是正确地分层我的 FIX 协议(protocol)库,以不同的方式处理不同的供应商特定消息,但为此拥有一个强大的支持 API。
我有两个接口(interface):

public interface ICriteria
{
    bool AreMet(Message message);
}

public interface IConsumer
{
    ICriteria Criteria { get; }
    void HandleMessage(Message message);
}

消费者有一个默认的抽象实现:
namespace Fix.MessageHandling
{
    public abstract class Consumer : IConsumer
    {
        private readonly ICriteria criteria;
        protected readonly IProcessor Processor;

        public ICriteria Criteria
        {
            get { return this.criteria; }
        }

        protected Consumer(IProcessor processor, ICriteria criteria)
        {
           //...
        }
    }
}

然后我有一些不同 FIX 消息类型的抽象实现:每个消费者抽象都有自己的 Criteria 抽象。 (也在构造函数中引用)例如
namespace Fix.MessageHandling.ExecutionReport
{
    public abstract class Consumer : MessageHandling.Consumer
    {
        protected Consumer(IProcessor processor, Criteria  criteria)
            : base(processor, criteria)
        {
           // ...
        }
    }
    public abstract class Criteria : ICriteria
    {
        // ...
    }
}

我从代码注册 ICriteria 实例:
container.RegisterType<ICriteria, Vendor.Criteria.Spot>("SpotCriteria");
container.RegisterType<ICriteria, Vendor.Criteria.Swap>("SwapCriteria");
// etc.

之后我注册了 IConsumer insatnces,在这种情况下是 ExecutionReportConsumer 实例,但我映射到 IConsumer:
container.RegisterType<
            IConsumer,
            Vendor.Consumer.Spot>("SpotConsumer",
            new InjectionConstructor(
                container.Resolve<IProcessor>(),
                container.Resolve<ICriteria>("SpotCriteria")));
// etc.

当我解析 IConsumer-s 时,我可以从 UnityContainer 获取我所有注册的消费者:
container.ResolveAll<IConsumer>();

这是我在定义所有别名后尝试使用 xml 执行此操作的方式:
<register type="ICriteria" mapTo="ForwardCriteria" name="ForwardCriteria" />
<register type="IConsumer" mapTo="ForwardConsumer" name="ForwardConsumer">
  <constructor>
    <param name="processor" dependencyType="IProcessor" />
    <param name="criteria" dependencyType="ExecutionReportCriteria" dependencyName="ForwardCriteria" />
  </constructor>
</register>

如果我使用 xml 配置并为 IConsumers 调用 ResolveAll,则会出现异常

依赖项解析失败,type = "Fix.MessageHandling.IConsumer", name = "ForwardConsumer"。
异常发生时:解决时。

异常是: InvalidOperationException - 类型 Criteria 没有可访问的构造函数。

在异常发生时,容器是:

解析 Fix.Vendor.Consumer.Forward,ForwardConsumer(映射自 Fix.MessageHandling.IConsumer, ForwardConsumer)
解析构造函数 Fix.Vendor.Consumer.Forward 的参数“标准”(Fix.MessageHandling.IProcessor 处理器,Fix.MessageHandling.ExecutionReport.Criteria 标准)
解决 Fix.MessageHandling.ExecutionReport.Criteria,ForwardCriteria

最佳答案

好的,实际上我自己想出了这个,我是一个新手,不知道该怎么做 - 所以我回答我自己的问题:]

如果我将标准接口(interface)和我的具体标准实现注册到正确的抽象基类,那么它就像一个魅力!

<register type="ICriteria" />
<register type="ExecutionReportCriteria" mapTo="ForwardCriteria" name="ForwardCriteria" />
<register type="IConsumer" mapTo="ForwardConsumer" name="ForwardConsumer">
  <constructor>
    <param name="processor" dependencyType="IProcessor" />
    <param name="criteria" dependencyName="ForwardCriteria" />
  </constructor>
</register>

关于c# - 当中间有抽象类时,将 Unity 代码即配置移动到 XML,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32788270/

10-13 06:10