我有一个具有工作流程的标准应用程序。客户可以在设计器中自定义工作流程。现在我们正在为特定客户制作一些自定义活动。自定义活动通过接口与业务层进行通信。如何为接口提供该接口的实现?
标准应用程序不了解该接口的接口和实现非常重要,因为它是该特定客户的自定义代码。该活动是通过标准工作流找到的,因此已经可以使用。
我看到很多关于扩展的信息,但我真的不知道它是如何工作的。
自定义活动
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
答案 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();
}
我希望它有所帮助。