13

Czy możliwe jest użycie DI w swoich działaniach związanych z przepływem pracy? a jeśli tak, to w jaki sposób?Wtrysk zależności/IoC w Workflow Foundation 4

Na przykład, jeśli masz działalność jak

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

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

Jak mogę ustawić Dependency?

(używam Spring.Net)

+0

Możesz także dodać prosty kontener DI samodzielnie jako rozszerzenie i uczynić go łatwo dostępnym z kontekstu metody Execute. http://blog.petegoo.com/index.php/2010/08/16/unit-test-workflow-4-activities-dependency-injection/ –

+0

Do tej pory utworzyłem kilka niestandardowych działań w moim projekcie zestawu narzędzi, który zapewnia to funkcjonalność. Określiłem to jako metodę rozwiązywania zależności (Service Locator jak Maurice, jak wskazano). Zajmie się scenariuszami trwałości działań i oczyści wszelkie zależności po ich zakończeniu. http://www.neovolve.com/post/2010/10/01/Custom-Windows-Workflow-activity-for-dependency-resolutione28093Wrap-up.aspx –

Odpowiedz

19

Workflow nie korzysta z kontenera IoC. Wykorzystuje wzorzec ServiceLocator, w którym dodaje się zależności do środowiska wykonawczego przepływu pracy jako rozszerzenia i działania przepływu pracy oraz pobiera te usługi z rozszerzeń przepływu pracy przez kontekst.

Identyfikator ServiceLocator i IOC są podobne i mają ten sam cel w zależnościach od rozdzielania. Przypis jest inny, ale w kontenerze IOC pchającym zależności, podczas gdy ServiceLocator służy do wyciągania zależności.

Przykład działalność:

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

    } 
} 

Klasa MyExtension jest rozszerzenie tutaj i nie ma wymagań klasy bazowej lub interfejsu.

+0

Dzięki za odpowiedź. Czy są dostępne przykłady/samouczki? – Fabiano

+0

Dodano próbkę. – Maurice

+0

Jeszcze raz dziękuję. Ale w ten sposób muszę dodać rozszerzenie w ramach działania. W naszym przypadku działania nie mają wiedzy na temat konstruowania rozszerzenia. Gdzie mogę dodać rozszerzenie, gdy instancja przepływu pracy jest konstruowana przez framework? – Fabiano