13

Ist es möglich, DI in Ihren Workflow-Aktivitäten zu verwenden? und wenn ja, wie?Abhängigkeitsinjektion/IoC in Workflow Foundation 4

Zum Beispiel, wenn Sie eine Aktivität wie

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

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

, wie ich Dependency einstellen kann?

(Ich verwende Spring.Net)

+0

Sie können auch einen einfachen DI-Container als Erweiterung hinzufügen und ihn über den Kontext Ihrer Execute-Methode leicht zugänglich machen. http://blog.petegoo.com/index.php/2010/08/16/unit-test-workflow-4-activities-dependency-injection/ –

+0

FYI, ich habe einige benutzerdefinierte Aktivitäten in meinem Toolkit-Projekt erstellt, die dies bereitstellen Funktionalität. Ich habe es als Abhängigkeitsauflösung bezeichnet (Service Locator als Maurice wie angegeben). Es wird sich um Persistenzszenarien kümmern und alle Abhängigkeiten aufräumen, wenn sie fertig sind. http://www.neovolve.com/post/2010/10/01/Custom-Windows-Workflow-activity-for-dependency-resolutione28093Wrap-up.aspx –

Antwort

19

Workflow-kein IOC-Container verwenden. Es verwendet das ServiceLocator-Muster, in dem Sie Abhängigkeiten zur Workflowlaufzeit als Erweiterungen und Workflowaktivitäten hinzufügen und diese Dienste über den Kontext von den Workflowerweiterungen abrufen.

Ein ServiceLocator- und IOC-Muster sind ähnlich und haben den gleichen Zweck beim Entkoppeln von Abhängigkeiten. Die Vorgehensweise unterscheidet sich jedoch in einem IOC-Container, in dem Abhängigkeiten zwischengespeichert werden, während ein ServiceLocator verwendet wird, um Abhängigkeiten herauszuziehen.

Beispiel Aktivität:

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

    } 
} 

Die My Extension-Klasse ist die Erweiterung hier und es hat keine Basisklasse oder Schnittstellenanforderungen.

+0

Danke für die Antwort. Gibt es Beispiele/Tutorials? – Fabiano

+0

Eine Probe hinzugefügt. – Maurice

+0

Danke nochmal. Aber so muss ich die Erweiterung innerhalb einer Aktivität hinzufügen. In unserem Fall haben die Aktivitäten nicht das Know-how, um die Erweiterung zu konstruieren. Wo kann ich die Erweiterung hinzufügen, wenn die Workflowinstanz vom Framework erstellt wird? – Fabiano