0

ルールを編集するための GUI を備えたルール エンジンである WF3.x の PolicyActivity の機能を基本的にレプリケートする xaml で再利用できるネイティブ アクティビティを作成しようとしています。

私の問題は、私が を呼び出すとWorkflowInvoker.Invoke、それが is である Model と表示されることです。これは、InArgumentこのNullコードが Frode Nilsen のブログのように Activity を返す関数として機能するためではないことがわかっています: Using WF 4 as a Rules Engine My質問は、InArgumentXaml アクティビティから正しく取得していますか?

 public sealed class RuleSequenceAcitvity : NativeActivity<Sequence>
{
    private Sequence _sequence;
    InArgument<HomeIndexViewModel> Model { get; set; } //Same name as inArgument in xaml

    protected override void Execute(NativeActivityContext context)
    {
        populateSequence();
        var input = new Dictionary<string, object>();
        //The following line is giving me the Null Argument Exception
        var model = context.GetValue<HomeIndexViewModel>(this.Model);
        input.Add("Model", model);
        WorkflowInvoker.Invoke(_sequence, input);

    }

    private void populateSequence()
    {
        //get the list of rules from repository
        var rules = ObjectFactory.Container.GetInstance<IRuleRepository>().Rules.ToList();

        //Declare a dynamic property as the view model
        var inProperty = new DynamicActivityProperty
        {
            Name = "Model",
            Type = typeof(InArgument<HomeIndexViewModel>),
            Value = Model
        };
        var activity = new DynamicActivity() { Properties = { inProperty } };

        //Import references
        Common.AddVbSetting(activity);

        _sequence = new Sequence();
        activity.Implementation = () => _sequence;

        //Sort Descending - those added first are lowest priority
        var sortedRules = rules.OrderBy(x => x.Priority).ToList();

        foreach (var inRule in rules)
        {
            var outRule = RuleConverter.ToIfActivity(inRule);
            _sequence.Activities.Add(outRule);
        }

    }
}

}

4

1 に答える 1

1

あなたはほとんどそこにいます。

まず、InArgument<HomeIndexViewModel>パブリックとして宣言する必要があります。そうしないと、アクティビティを呼び出す側がその入力をそれにバインドできなくなります。

_sequence第二に、入力引数を受け取るのはあなたではありません。シーケンスではなく、引数を呼び出して渡す必要があるのは動的アクティビティです。

最後に、正しく作成していますDynamicActivityPropertyが、この場合は値を設定する必要はありません。Workflow.Invoker()という入力で呼び出すと、"Model"同じ入力が動的プロパティにバインドされます。

コードを実行せずに編集しました。それが役に立てば幸い!:)

public sealed class RuleSequenceAcitvity : NativeActivity<Sequence>
{
    private DynamicActivity _dynamicActivity;
    public InArgument<HomeIndexViewModel> Model { get; set; }

    protected override void Execute(NativeActivityContext context)
    {
        populateDynamicActivity();

        var input = new Dictionary<string, object>();

        // It was throwing a null reference because Model
        // was private, so the input that the activity was receiving 
        // was never binded to it.

        var model = context.GetValue<HomeIndexViewModel>(this.Model);
        input.Add("Model", model);

        // It's the dynamic activity that contains input arguments.
        // Not the sequence. 

        WorkflowInvoker.Invoke(_dynamicActivity, input);
    }

    private void populateDynamicActivity()
    {
        //get the list of rules from repository
        var rules = 
            ObjectFactory
            .Container
            .GetInstance<IRuleRepository>()
            .Rules
            .ToList();

        //Declare a dynamic property as the view model
        var inProperty = new DynamicActivityProperty
        {
            Name = "Model",
            Type = typeof(InArgument<HomeIndexViewModel>)
        };

        _dynamicActivity = new DynamicActivity() 
        { 
            Properties = { inProperty } 
        };

        //Import references
        Common.AddVbSetting(activity);

        var sequence = new Sequence();
        activity.Implementation = () => sequence

        //Sort Descending - those added first are lowest priority
        var sortedRules = rules.OrderBy(x => x.Priority).ToList();

        foreach (var inRule in rules)
        {
            var outRule = RuleConverter.ToIfActivity(inRule);
            sequence.Activities.Add(outRule);
        }

    }
}
于 2012-05-29T23:39:19.040 に答える