自定义工作流活动中的依赖注入

时间:2013-03-19 11:36:53

标签: c# ninject workflow-foundation-4 workflow-foundation

我有一个具有工作流程的标准应用程序。客户可以在设计器中自定义工作流程。现在我们正在为特定客户制作一些自定义活动。自定义活动通过接口与业务层进行通信。如何为接口提供该接口的实现?

标准应用程序不了解该接口的接口和实现非常重要,因为它是该特定客户的自定义代码。该活动是通过标准工作流找到的,因此已经可以使用。

我看到很多关于扩展的信息,但我真的不知道它是如何工作的。

自定义活动

public sealed class GetDealerDetails : CodeActivity
{
    /////// <summary>
    /////// The dealer controller with all the businesslogic.
    /////// </summary>
    ////private readonly IDealerController _dealerController;

    [Inject]
    public IDealerController DealerController { private get; set; }

    ////public GetDealerDetails()
    ////{

    ////}

    ////[Inject]
    ////public GetDealerDetails(IDealerController dealerController)
    ////{            
    ////    _dealerController = dealerController;
    ////}

    protected override void Execute(CodeActivityContext context)
    {
        Dealer dealer = DealerController.GetDealerDetails(5);
    }
}

我在标准应用程序中使用Ninject。我试图使用构造函数注入和属性注入,但它不起作用。 DealerController保留null

修改 其余代码可以在这里找到:Inject custom code in standard application

2 个答案:

答案 0 :(得分:2)

导入是您必须使用我提供的ninject工作流应用程序包装器。只有这样我才能积累活动。诀窍如下:您不能将构造函数注入与自定义工作流活动一起使用。 WF的活动非常特别。通常,当您编写了工作流时,我们在lambda表达式中创建新运算符,然后执行延迟执行。因此,我的ninject扩展只有在已经建立活动时才能发挥其魔力。因此,您需要在ninject的工作流应用程序中传递活动树的根活动。然后,它会在内部解析整个活动树,并注入使用inject属性修饰的所有属性。

但是你的实际问题是我现在修复的库中的一个错误。 BookmarkInfo装饰器假定范围信息始终设置,而事实并非如此。

答案 1 :(得分:2)

扩展是框架为工作流中的注入提供的内容。执行工作流时,您将添加将在活动中使用的所有依赖项。

[Dependency]
public IMyService MyService{ get; set; }

WorkflowApplication instance = new WorkflowApplication(myWorkflow, inParameters);
instance.Extensions.Add(MyService);
instance.Run();

然后您可以在活动中获取扩展名以便使用它。

protected override void Execute(NativeActivityContext context){    
    var myservice = context.GetExtension<IMyService>();
    myservice.MyMethod();
    }

我希望它有所帮助。