2015-12-16 11 views
7

Siehe dieses Beispiel statische Klasse unten.Der beste Weg, um diese statische Klasse in C# umzuformen?

public static class BackgroundTaskExecuter 
{ 
    public static void MethodA() 
    { 
     using (var service = IocManager.Instance.ResolveAsDisposable<IServiceA>()) 
     { 
      service.Object.MethodA(); 
     } 
    } 

    public static void MethodB() 
    { 
     using (var service = IocManager.Instance.ResolveAsDisposable<IServiceB>()) 
     { 
      service.Object.MethodB(); 
     } 
    } 

    public static void MethodC() 
    { 
     using (var service = IocManager.Instance.ResolveAsDisposable<IServiceC>()) 
     { 
      service.Object.MethodC(); 
     } 
    } 
} 

Wie Sie sehen können, habe ich drei Methoden. MethodA, MethodB und MethodC, die mit drei verschiedenen Schnittstellen entsprechen IServiceA, IServiceB und IServiceC

Der Grund, warum ich dies tue, ist, weil ich Hangfire.io mit aspnetboilerplate Rahmen und in Hangfire verwenden, hat eine Hintergrundaufgabe Httpcontext nicht von der normalen Dependency Injection. Das Erstellen einer statischen Klasse, die meine Anrufe manuell umschließt, wenn ich sie manuell auflöse, scheint dies zu umgehen.

Verwendung sieht wie folgt aus:

BackgroundJob.Enqueue(() => BackgroundTaskExecuter.MethodA()); 

Vorerst habe ich nur ein oder zwei Hintergrundaufgaben in meiner Web-app, aber möglicherweise kann ich viel mehr in der Zukunft haben und während es jetzt wartbar, es wird schließlich hässlich, wenn ich diesen Ansatz halte.

Gibt es eine bessere Möglichkeit, dies zu tun/zu refaktorieren? Ein Fabrikmuster oder ähnliches?

Danke.

+1

@RuneFS Beispiel/hypothetische/MCVE-Code ist nicht-Thema auf [codereview.se]. Siehe [Leitfaden zur Code-Überprüfung für SO-Benutzer] (http://meta.codereview.stackexchange.com/questions/5777/a-guide-to-code-review-for-stack-overflow-users). –

+0

Ich würde argumentieren, dass diese Frage tatsächlich dem in der Hilfe definierten Bereich entspricht. –

Antwort

6

Ich würde den statischen Wrapper generisch und einfach machen. Lassen Sie eine einzelne Methode verfügbar machen, die den Dienst auflöst und über die Anweisung using verarbeitet, damit der Aufrufer die Instanz aufrufen kann, die an die Action<T> übergeben wurde.

Quelle

public static class BackgroundTaskExecuter 
{ 
    public static void ResolveAndConsume<T>(Action<T> consumeService) 
    { 
     // Consider applying constraint to the <T> to 
     // match the constraint of ResolveAsDisposable<T> 
     using (var service = IocManager.Instance.ResolveAsDisposable<T>()) 
     { 
      consumeService(service); 
     } 
    } 
} 

Beispiel Verwendung

BackgroundJob.Enqueue(() => 
    BackgroundTaskExecuter.ResolveAndConsume<IServiceA>(serviceA => serviceA.MethodA())); 

Mit der oben Sie dann und verbrauchen nach Wunsch eine Implementierung des Service lösen könnte und seine Funktionalität nennen.

+1

Die Frage ist, ob all diese Dienste eine gemeinsame Schnittstelle haben, würde ich annehmen, aber es gibt keinen Hinweis darauf –

+1

Ich machte eine Annahme, dass "T" eine Einschränkung von "IService" hätte, aber das ist nicht notwendig. Es sollte nur der Einschränkung der 'ResolveAsDisposable ' Methode folgen. –

Verwandte Themen