4

一連のルールをビジネスオブジェクトのコレクションに適用したいと思います。これらは単純なルールであり、既存のビジネスルールエンジンは使用したくありません。

各ルールに異なるコンテキストを渡す必要があるため、理論的には、すべてのルールに異なるパラメーターが必要になる場合があります。以下は私が現在それをしている方法です。他の/より良い方法はありますか?

注:Visitorパターンを使用して評価しましたが、この特定のシナリオでは手間がかかりすぎるようです。実際のルールは、私が例に示したものほど複雑ではありません。

interface IParamBase {}

interface IParam : IParamBase
{
    string MyProperty {get; set;}
}

class Param : IParam
{
    public string MyProperty {get; set;}
}

interface IRule
{
    void Setup(IParamBase param);
    void Apply(BusinessObject businessObject);
}

class Rule :IRule
{
    IParam _param;
    public void Apply(BusinessObject businessObject)
    {
        businessObject.AssignedFromRule = _param.MyProperty;
        Console.WriteLine(businessObject.AssignedFromRule);
    }

    public void Setup(IParamBase param)
    {
        _param = param as IParam;
    }
}

class BusinessObject
{
    public string AssignedFromRule {get; set;}
}

void Main()
{
    var rule = new Rule();
    var param = new Param();
    param.MyProperty = "my property";
    BusinessObject businessObject = new BusinessObject();
    rule.Setup(param);
    rule.Apply(businessObject);
}

更新:ダウンキャストの必要性をサンプルに追加するのを忘れました。

4

1 に答える 1

2

あなたのコードは事実上Visitorパターンです。ビジネスオブジェクトにBusinessObject.Apply(BusinessRule rule){rule.apply(this);のようなメソッドがあるとより明確になります。};

これは、本格的な実装と同じ目的を果たします。操作が実行されるオブジェクト(ビジネスオブジェクト)を拡張せずに、操作(ビジネスルール)を追加できます。

一連のルールを1つのルールとして適用できるように、Compositeの使用に興味があるかもしれません。また、Visitorの実装で使用するカルスについてもう少し明確にすることに興味があるかもしれませんが、それがうまくいく場合は、それを選択してください。

于 2012-10-24T06:41:10.733 に答える