2015-12-16 19 views
7

Xem ví dụ này lớp tĩnh bên dưới.Cách tốt nhất để cấu trúc lại lớp tĩnh này trong 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(); 
     } 
    } 
} 

Như bạn có thể thấy, tôi có ba phương pháp. MethodA, MethodB, và MethodC tương ứng với ba giao diện khác nhau IServiceA, IServiceBIServiceC

Lý do tôi đang làm điều này là bởi vì tôi đang sử dụng Hangfire.io với khuôn khổ aspnetboilerplate và trong Hangfire, một nhiệm vụ nền không có HttpContext từ Injection Dependency bình thường. Tạo một lớp tĩnh kết thúc cuộc gọi của tôi, nơi tôi giải quyết thủ công dường như để có được xung quanh này.

Cách sử dụng như sau:

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

Còn bây giờ, tôi chỉ có một hoặc hai nền nhiệm vụ trong ứng dụng web của tôi, nhưng hình dung tôi có thể có nhiều hơn trong tương lai và trong khi nó duy trì bây giờ, nó cuối cùng sẽ xấu đi nếu tôi giữ cách tiếp cận này.

Có cách nào tốt hơn để làm điều này/refactor này? Một mô hình nhà máy hoặc bất cứ điều gì như thế có lẽ?

Cảm ơn.

+1

@RuneFS ví dụ/mã giả thuyết/MCVE không có chủ đề trên [codereview.se]. Vui lòng xem [Hướng dẫn về Đánh giá mã cho người dùng SO] (http://meta.codereview.stackexchange.com/questions/5777/a-guide-to-code-review-for-stack-overflow-users). –

+0

Tôi cho rằng câu hỏi này thực sự tuân theo phạm vi được xác định trong trung tâm trợ giúp. –

Trả lời

6

Tôi sẽ làm cho trình bao bọc tĩnh chung và đơn giản. Hãy để nó phơi bày một phương thức duy nhất để giải quyết dịch vụ và tiêu thụ nó thông qua câu lệnh using, cho phép người gọi gọi cá thể được truyền vào trong Action<T>.

Nguồn

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

Ví dụ cách dùng

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

Với trên sau đó bạn có thể giải quyết và tiêu thụ thực hiện một trong những dịch vụ và gọi chức năng của nó như mong muốn.

+1

Câu hỏi đặt ra là tất cả các dịch vụ đó đều có giao diện chung mà tôi giả sử nhưng không có dấu hiệu nào cho rằng –

+1

Tôi giả định rằng 'T' sẽ có một ràng buộc của' IService', nhưng điều đó không cần thiết. Nó chỉ nên tuân theo ràng buộc của phương thức 'ResolveAsDisposable '. –

Các vấn đề liên quan