私は、すべての特定のルールが汎用Rule<TEntity>
オブジェクトによって反映されるプロジェクト用の小さなアクセスルールモジュールを構築してきました。ルールは、特定のロジックを実行するためにデリゲートを取ります。
RulesContext
次のような特定のエンティティ「foo」へのアクセスをチェックするメソッドを提供するクラスがあります。
rulesContext.CanIRead<Foo>(myFoo);
私の意図は、セットアッププロセス中に作成されたすべてのルールを1つのコレクションに保存することでした。しかし、私が試みたすべてのアプローチは行き止まりにつながりました。
私は次のようなことを考えました:
IDictionary<Type, Rule<object>> _rules = new Dictionary<Type, Rule<object>>();
と:
var fooRule = new Rule<Foo>(foo => foo.FullfillsACertainFooCriterion())
_rules.Add(typeof(Foo), fooRule);
実装により、CanIRead
辞書が適切に使用されるようになります。
public bool CanIRead<TEntity>(TEntity entity)
{
var rule = _rules[typeof(entity)];
return rule.CanIRead(entity);
}
しかし、コンパイラはこれを好みません。Rule<Foo>
タイプのパラメータに割り当てることはできませんRule<object>
。コントラクトが破られるので、どちらの種類が理にかなっています(これは、Foo型のオブジェクトのみを受け入れるfooRuleには当てはまらないパラメーターとして、任意のオブジェクトで辞書のメソッドを使用できることを示しています。-リスコフの原則)
しかし、私はこれを解決する方法を考えることができません。Rule
異なるタイプのオブジェクトを1つのコレクションに保存するにはどうすればよいですか?