13

È possibile utilizzare DI nelle attività del flusso di lavoro? e se si, come?Iniezione di dipendenza/IoC in Workflow Foundation 4

Per esempio, se si dispone di un'attività come

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

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

Come posso impostare Dependency?

(sto usando Spring.Net)

+0

È anche possibile aggiungere un semplice contenitore DI come estensione e renderlo facilmente accessibile dal contesto del metodo Execute. http://blog.petegoo.com/index.php/2010/08/16/unit-test-workflow-4-activities-dependency-injection/ –

+0

FYI, Ho creato alcune attività personalizzate nel mio progetto di toolkit che forniscono questo funzionalità. L'ho definita risoluzione di dipendenza (Service Locator come Maurice come indicato). Si prenderà cura degli scenari di persistenza delle attività e pulirà tutte le dipendenze quando avranno finito. http://www.neovolve.com/post/2010/10/01/Custom-Windows-Workflow-activity-for-dependency-resolutione28093Wrap-up.aspx –

risposta

19

flusso di lavoro non usa un contenitore CIO. Utilizza il pattern ServiceLocator in cui aggiungi dipendenze al runtime del flusso di lavoro come estensioni e attività del flusso di lavoro e recuperi questi servizi dalle estensioni del flusso di lavoro attraverso il contesto.

Un modello ServiceLocator e IOC sono simili e hanno lo stesso scopo nelle dipendenze di disaccoppiamento. L'apporach è diverso in un contenitore IOC che spinge le dipendenze mentre un ServiceLocator viene utilizzato per estrarre le dipendenze.

attività Esempio:

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 classe myextension è l'estensione qui e non ha requisiti della classe di base o di interfaccia.

+0

Grazie per la risposta. Ci sono esempi/tutorial disponibili? – Fabiano

+0

Aggiunto un campione. – Maurice

+0

Grazie ancora. Ma come questo devo aggiungere l'estensione all'interno di un'attività. Nel nostro caso le attività non hanno il know how di costruire l'estensione. Dove posso aggiungere l'estensione quando l'istanza del flusso di lavoro è costruita dal framework? – Fabiano

Problemi correlati