gpt4 book ai didi

c# - 当有多个处理程序时选择最具体的处理程序

转载 作者:行者123 更新时间:2023-11-30 20:56:27 25 4
gpt4 key购买 nike

对不起标题。

我有一个系统是面向服务架构的一部分。它接收消息并处理它们。该过程可以简单地归结为将数据从一个位置移动到另一个位置。系统做出的所有决定都可以通过检查系统始终可用的两个不同类来做出:

  1. 正在处理的消息
  2. 特定数据操作的配置信息(从哪里移动到哪里等)

主要界面如下

    public interface IComponent
{
bool CanHandle(Message theMessage, Configuration theConfiguration);
int Priority {get;}
}

public interface IComponentLocator<T>
where T : IComponent
{
public LocateComponent(Message theMessage, Configuration theConfiguration);
}

我使用 CaSTLe Windsor 框架来解决依赖倒置问题,因此我实现的定位器接收通过数组解析器注入(inject)的所有适当组件。

这里是:

public class InjectedComponentsLocator<T> : IComponentLocator<T>
where T : IComponent
{
private readonly T[] components;

public InjectedComponentsLocator(T[] components)
{
this.components = components;
this.components.OrderBy((component) => component.Priority);
}

public T LocateComponent(Message theMessage, Configuration theConfiguration)
{
List<T> candidates = this.components.Where((h) => h.CanHandle(message, configuration)).ToList();

if (candidates.Count == 0)
{
throw new Exception(string.Format(Resources.UnableToLocateComponentException, typeof(T).Name));
}
else if (candidates.Count > 1 && candidates[0].Priority == candidates[1].Priority)
{
throw new Exception(string.Format(Resources.AmbiguousComponentException, candidates[0].GetType().Name, candidates[1].GetType().Name));
}

return candidates.First();
}
}

现在进入问题。 IComponent 接口(interface)上的 Priority 属性。我不喜欢它。实际情况是优先级应该能够由最具体的 IComponent 确定。

例如,假设我有两个组件。

    public class HandlesOneRecord : IComponent
{
public bool CanHandle(Message theMessage, Configuration theConfiguration)
{
return theMessage.BatchSize == 1;
}
}

public class HandlesOneInsert : IComponent
{
public bool CanHandle(Message theMessage, Configuration theConfiguration)
{
return theMessage.BatchSize == 1 && theMessage.Action = "Insert";
}
}

我想让系统知道一条记录的插入消息需要选择第二条,因为它是最具体的一条。现在我需要设置不同的优先级,感觉它会变得笨拙并在创建新组件时产生错误。

添加以尝试澄清:
如果系统最终按照我设想的方式工作,我将能够拥有两个组件,一个组件将处理任何“插入”类型的操作,还有一个特定组件将处理 batchsize = 1 的“插入”。任何开发人员编写代码不必关心系统是否选择了正确的,它会选择。

谢谢!

最佳答案

您可以通过使用评分系统来做到这一点。

public sealed class Score
{
private int _score;

public Score(params bool[] conditions)
{
foreach(bool b in conditions)
{
if(b)
++_score;
else
{
_score = 0;
break;
}
}
} // eo ctor

public int Total { get { return _score; } }
} // eo class Score

你的 IComponent可能看起来像这样:

public interface IComponent
{
Score CanHandle(Message theMessage, Configuration theConfiguration);
} // eo IComponent

专长:

public class HandlesOneRecord : IComponent
{
public Score CanHandle(Message theMessage, Configuration theConfiguration)
{
return new Score(theMessage.BatchSize == 1);
}
}

public class HandlesOneInsert : IComponent
{
public Score CanHandle(Message theMessage, Configuration theConfiguration)
{
return new Score(theMessage.BatchSize == 1, theMessage.Action == "Insert");
}
}

然后找到最合适的处理程序,遍历并选择得分最高的处理程序。如果您有 100 个处理程序,则可以通过为 Message 生成哈希码来提高其性能。 ,并将成功的查找存储在 Dictionary<int, Func<Message, Configuration, Score>> 中.

关于c# - 当有多个处理程序时选择最具体的处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17516229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com