2013-03-19 86 views
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

编辑 的代码的其余部分可以在这里找到:Inject custom code in standard application

+0

我也看到有一个工作流程ninject nuget包,但我不能得到它的工作... – 2013-03-19 11:39:38

+0

谢谢你的答复。私人是在获得,而不是在网站上。如果我删除私​​人获取,它仍然不起作用。请参阅此处的示例:https://github.com/ninject/ninject/wiki/Injection-Patterns#property-setter-injection – 2013-03-19 11:42:04

回答

1

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

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

+0

很高兴听到该错误已修复。感谢您对我的测试项目提供的所有帮助。 Ninject规则:) – 2013-03-25 12:34:34

1

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

[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(); 
    } 

我希望它有帮助。

+0

唯一的问题是主应用程序可能不知道该扩展名。这就是我使用Ninject工作流程扩展的原因。这样,你可以将它注入主应用程序。在主应用程序和特定客户的特定定制活动之间没有任何参考。 – 2013-04-04 18:44:09

+0

我使用部署在一个文件夹中的插件解决了这个问题,主应用程序发现它们并将它们作为扩展注册它们。 – 2013-04-18 15:43:56