2

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

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

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

自定义活动

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。_

编辑 其余代码可以在这里找到:在标准应用程序中注入自定义代码

4

2 回答 2

2

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

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

于 2013-03-21T21:42:58.753 回答
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();
    }

我希望它有所帮助。

于 2013-04-03T16:53:43.450 回答