是否可以在工作流活动中使用 IUnityContainer 作为扩展 (WF 4.0)?
protected override bool Execute(CodeActivityContext context)
{
var container = context.GetExtension<IUnityContainer>();
var db = container.Resolve<IDatabaseContext>();
// ...
}
请给我一个例子,如何正确地做到这一点。
我避免将容器放在扩展列表中。只需获得您真正需要的扩展,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
{
}
此线程提供代码示例和链接,说明如何实现所需的内容。
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
{
}