2015-12-16 16 views
7

Zobacz poniższy przykład klasy statycznej.Najlepszy sposób na refactor tej klasy statycznej w języku C#?

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

Jak widać, mam trzy metody. MethodA, MethodB i MethodC które odpowiadają trzy różne interfejsy IServiceA, IServiceB, a IServiceC

Powodem Robię to dlatego używam Hangfire.io z ram aspnetboilerplate aw Hangfire, zadanie w tle nie ma HttpContext od normalnej iniekcji Dependency. Stworzenie klasy statycznej, która owija moje połączenia tam, gdzie ręcznie, wydaje się ominąć to.

Wykorzystanie wygląda następująco:

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

Na razie mam tylko jeden lub dwa w tle zadania w mojej aplikacji sieci web, ale niewykluczone może mam dużo więcej w przyszłości, podczas gdy obecnie jest to w utrzymaniu, to w końcu będzie brzydko, jeśli utrzymam takie podejście.

Czy jest lepszy sposób to zrobić/refactor to? Może wzór fabryczny czy coś podobnego?

Dzięki.

+1

@RuneFS przykład/hipotetyczny/kod MCVE jest nie na temat w [codereview.se]. Zobacz [Przewodnik po Code Review dla użytkowników SO] (http://meta.codereview.stackexchange.com/questions/5777/a-guide-to-code-review-for-stack-overflow-users). –

+0

Twierdzę, że to pytanie rzeczywiście jest zgodne z zakresem zdefiniowanym w Centrum pomocy. –

Odpowiedz

6

Uczyniłbym opakowanie statyczne generycznym i prostym. Niech eksponuje jedną metodę, która rozwiązuje usługę i pobiera ją za pomocą instrukcji, pozwalając wywołującemu wywołać instancję przekazaną do Action<T>.

Źródło

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

Przykład użycia

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

Z powyższego was może następnie rozwiązać i zużywają implementację usługi i wywołać jego funkcjonalności zgodnie z zapotrzebowaniem.

+1

Pytanie brzmi, czy wszystkie te usługi mają wspólny interfejs, który bym zakładał, ale nic nie wskazuje na to, że –

+1

założyłem, że 'T' będzie miało ograniczenie" IService ", ale nie jest to konieczne. Powinien być zgodny z ograniczeniem metody 'ResolveAsDisposable '. –

Powiązane problemy