13

¿Es posible usar DI en sus actividades de flujo de trabajo? y si es así, ¿cómo?Inyección de dependencia/IoC en Workflow Foundation 4

Por ejemplo, si tiene una actividad como

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

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

¿Cómo puedo configurar Dependency?

(estoy usando Spring.Net)

+0

También puede agregar un contenedor DI simple usted mismo como una extensión y hacer que sea fácilmente accesible desde el contexto del método Execute. http://blog.petegoo.com/index.php/2010/08/16/unit-test-workflow-4-activities-dependency-injection/ –

+0

FYI, he creado algunas actividades personalizadas en mi proyecto de kit de herramientas que proporcionan este funcionalidad. Lo he denominado resolución de dependencia (Service Locator como Maurice, como se indica). Se ocupará de los escenarios de persistencia de la actividad y limpiará las dependencias cuando hayan terminado. http://www.neovolve.com/post/2010/10/01/Custom-Windows-Workflow-activity-for-dependency-resolutione28093Wrap-up.aspx –

Respuesta

19

de flujo de trabajo no utiliza un recipiente COI. Utiliza el patrón ServiceLocator donde agrega dependencias al tiempo de ejecución del flujo de trabajo como extensiones y actividades de flujo de trabajo y recupera estos servicios de las extensiones de flujo de trabajo a través del contexto.

Un patrón ServiceLocator y IOC son similares y tienen el mismo propósito en desacoplar dependencias. El apporach es diferente, aunque en un contenedor IOC empujando las dependencias mientras que un ServiceLocator se usa para extraer las dependencias.

actividad Ejemplo:

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

    } 
} 

La clase MyExtension es la extensión aquí y no tiene requisitos de la clase de base o de interfaz.

+0

Gracias por la respuesta. ¿Hay ejemplos/tutoriales disponibles? – Fabiano

+0

Se agregó una muestra. – Maurice

+0

Gracias de nuevo. Pero así tengo que agregar la extensión dentro de una actividad. En nuestro caso, las actividades no tienen el know how de construir la extensión. ¿Dónde puedo agregar la extensión cuando el framework crea la instancia de flujo de trabajo? – Fabiano

Cuestiones relacionadas