タイトル失礼します。
サービス指向アーキテクチャの一部であるシステムがあります。メッセージを受信して処理します。このプロセスは、ある場所から別の場所へのデータの移動に簡単に要約できます。システムが下すすべての決定は、システムが常に利用できる 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 フレームワークを使用しているため、実装した 1 つのロケーターは、配列リゾルバーを介して注入された適切なコンポーネントをすべて受け取ります。
ここにあります:
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();
}
}
今質問に。インターフェイスのPriority
プロパティIComponent
..私はそれが好きではありません。現実には、優先順位は最も具体的なものによって決定できるはずIComponent
です。
たとえば、2 つのコンポーネントがあるとします。
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";
}
}
1 つのレコードの挿入メッセージが 2 番目のレコードを選択する必要があることをシステムに知らせたいのは、それが最も具体的なレコードだからです。現時点では、さまざまな優先度レベルを設定する必要がありますが、それでは扱いにくくなり、将来的に新しいコンポーネントを作成するときにバグが発生するように感じます。
明確化のために追加:
システムが思い通りに動作するようになった場合、「挿入」タイプのアクションを処理する2つのコンポーネントと、バッチサイズが「挿入」を処理する特定のコンポーネントを持つことができます。 = 1. コードを書く開発者は、システムが正しいものを選択することを気にする必要はありません。
ありがとう!