如何在工作流程活动中正确使用Unity?

时间:2012-10-03 18:15:38

标签: .net unity-container workflow-foundation-4 workflow-foundation

使用IUnityContainer作为工作流活动(WF 4.0)的扩展是否可以?

protected override bool Execute(CodeActivityContext context)
{
    var container = context.GetExtension<IUnityContainer>();
    var db = container.Resolve<IDatabaseContext>();
    // ...
}

请给我一个如何做正确的例子。

3 个答案:

答案 0 :(得分:3)

我不会将容器放在扩展名单中。只需获得您真正需要的扩展名 IDatabaseContext 。通常会更好。

关于包含依赖注入框架的最佳方法,一种方法是将WorkflowApplication或WorkflowInvoker对象包装在支持Unity的实用程序类中,并将所有接口/类型作为内部WorkflowApplication的扩展提供。

另一个建议是在您的活动的CacheMetadata方法中注册所需的扩展名。此方法用于在执行工作流之前验证工作流程。

public sealed class SampleActivity : CodeActivity
{
    protected override void CacheMetadata(CodeActivityMetadata metadata)
    {
        // Require the IDatabaseContext extension to be defined in the workflow host
        // application. The workflow will fail validation if an extension with this
        // interface is not provided.
        metadata.RequireExtension<IDatabaseContext>();
    }

    protected override void Execute(CodeActivityContext context)
    {
        var dbContext = context.GetExtension<IDatabaseContext>();
    }
}

public interface IDatabaseContext
{
}

答案 1 :(得分:0)

This thread提供了解释如何实现所需内容的代码示例和链接。

答案 2 :(得分:0)

public sealed class SampleActivity : CodeActivity
{
    protected override void CacheMetadata(CodeActivityMetadata metadata)
    {
        // Require the IDatabaseContext extension to be defined in the workflow host
        // application. The workflow will fail validation if an extension with this
        // interface is not provided.
        metadata.RequireExtension<IDatabaseContext>();
    }

    protected override void Execute(CodeActivityContext context)
    {
        var dbContext = context.GetExtension<IDatabaseContext>();
    }
}

public interface IDatabaseContext
{
}