依赖注入/控制反转在Workflow Foundation 4中的应用

12

你能否在工作流活动中使用DI(依赖注入)?如果可以,该如何实现?

例如,如果你有一个这样的活动:

public sealed class MyActivity : CodeActivity
{
    public MyClass Dependency { get; set; }

    protected override void Execute(CodeActivityContext context)
    {
        Dependency.DoSomething();
    }
}

我该如何设置Dependency

(我正在使用Spring.Net)


我在我的工具包项目中创建了一些自定义活动,提供此功能。我将其称为依赖项解析(如Maurice所示的服务定位器)。它将处理活动持久性方案,并在完成时清理任何依赖项。http://www.neovolve.com/post/2010/10/01/Custom-Windows-Workflow-activity-for-dependency-resolutione28093Wrap-up.aspx - Rory Primrose
你也可以将一个简单的 DI 容器作为扩展添加到代码中,并使其在 Execute 方法的上下文中轻松访问。http://blog.petegoo.com/index.php/2010/08/16/unit-test-workflow-4-activities-dependency-injection/ - Peter Goodman
1个回答

20

工作流程不使用IOC容器。它使用ServiceLocator模式,其中您将依赖项添加为扩展和工作流活动到工作流运行时,并通过上下文从工作流扩展检索这些服务。

ServiceLocator和IOC模式相似,具有在解耦依赖项方面相同的目的。但是,其方法不同,IOC容器会将依赖项注入,而ServiceLocator用于提取依赖项。

示例活动:

public class MyBookmarkedActivity : NativeActivity
{
    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);
        metadata.AddDefaultExtensionProvider<MyExtension>(() => new MyExtension());
    }

    protected override void Execute(NativeActivityContext context)
    {
        var extension = context.GetExtension<MyExtension>();
        extension.DoSomething();

    }
}

这里的扩展是MyExtension类,它没有基类或接口要求。


谢谢答案。有没有可用的示例/教程? - Fabiano
再次感谢。但是这样我必须在活动中添加扩展名。在我们的情况下,活动不知道如何构建扩展。当工作流实例由框架构建时,我可以在哪里添加扩展名? - Fabiano
您还可以向WorkflowInvoker、WorkflowApplication或WorkflowServiceHost添加扩展。使用前两者的Extensions集合以及WorkflowServiceHost的WorkflowExtensions即可。 - Maurice
好的,我明白了 :-) 我还找到了这个关于托管在IIS中的工作流的信息:http://social.msdn.microsoft.com/forums/en-us/wfprerelease/thread/A9B45EAF-C8E2-444C-819D-E448868E68BB(未经测试) - Fabiano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接