编程语言
首页 > 编程语言> > c#-在之间有抽象类时将Unity code-as-config迁移到XML

c#-在之间有抽象类时将Unity code-as-config迁移到XML

作者:互联网

我已经从代码配置了一个工作的Unity容器.我必须转到xml配置,但无法正确进行配置.我不知道我在想什么-也许有人在那里知道解决方案并可以帮助我!

我的解决方案是正确地对我的FIX协议库进行分层,以不同方式处理不同供应商的特定消息,但要为此提供一个良好而强大的支持API.
我有两个界面:

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消息类型提供了一些抽象实现:每个Consumer抽象都有自己的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实例,在本例中为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,则会出现异常

解决依赖关系失败,键入=“ Fix.MessageHandling.IConsumer”,名称=“ 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

解决方法:

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

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

<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>

标签:configuration,unity-container,xml,c,net
来源: https://codeday.me/bug/20191119/2037960.html