2010-07-05 31 views
7

Điều này có vẻ hơi lạ, nhưng tôi thực sự cần phải tạo một giải pháp cho việc xử lý song công - giao tiếp rất phức tạp trong C#, đặc biệt là để buộc các nhà phát triển khác quan sát nguyên tắc DRY.C#: sử dụng loại "tự" làm thông số chung?

Vì vậy, những gì tôi đang làm là phải có một loại multiton dựa trông như thế này:

internal sealed class SessionManager<T> where T : DuplexServiceBase 

đó là không có vấn đề gì cả - cho đến nay.

Tuy nhiên, ngay sau khi tôi muốn có sự phục vụ (Tôi sẽ có một ví dụ cho mỗi phiên) đăng ký với chính SessionManager, những rắc rối bắt đầu:

internal abstract class DuplexServiceBase : MessageDispatcherBase<Action> 

(MessageDispatcherBase là một lớp học của tôi tạo một luồng và gửi không đồng bộ các thư).

Tôi muốn có một phương pháp mà trông như thế này:

protected void ProcessInboundMessage() 
    { 
     // Connect 
     SessionManager<self>.Current.Connect(this); 
    } 

... nhưng vấn đề là - làm thế nào tôi sẽ nhận được để "tự"? Tôi thực sự CẦN người quản lý phiên riêng biệt cho mỗi lớp dịch vụ, vì tất cả họ đều có thông báo riêng của họ (về cơ bản nó gây phiền toái "NotifyAllClients" - phương pháp khiến chúng tôi muốn kéo tóc của mình ra ngoài trong giờ qua) và cần được điều trị riêng.

Bạn có BẤT K ideas ý tưởng nào không?

Tôi không muốn sử dụng "AsyncPattern = true", btw ... điều này sẽ yêu cầu tôi từ bỏ loại an toàn, tuân thủ hợp đồng được thực thi (điều này sẽ dẫn đến lạm dụng rất xấu hệ thống liên lạc mà tôi đang thiết lập ở đây) và sẽ yêu cầu từ bỏ nguyên tắc DRY, sẽ có rất nhiều mã lặp đi lặp lại khắp nơi, và đây là điều tôi nghiêm túc cau mày.

Edit:

Tôi đã tìm thấy giải pháp tốt nhất có thể, nhờ vào các câu trả lời ở đây - đó là một phương pháp khuyến nông, hehe ...

public static SessionManager<T> GetSessionManager<T>(this T sessionObject) 
     where T : DuplexServiceBase 
    { 
     return SessionManager<T>.Current; 
    } 

Tôi có thể sử dụng như thế này:

GetSessionManager().Connect(this); 

Nhiệm vụ đã hoàn thành. :-D

Phương pháp này (thuộc về DuplexServiceBase) cung cấp cho tôi trình quản lý phiên mà tôi muốn làm việc. Hoàn hảo! :-)

Trả lời

15

Tôi muốn viết một phương pháp helper:

static class SessionManager { // non-generic! 
    static void Connect<T>(T item) where T : DuplexServiceBase { 
     SessionManager<T>.Current.Connect(item); 
    } 
} 

và sử dụng SessionManager.Connect(this) mà sẽ tìm nó ra tự động thông qua generic loại suy luận.

+0

bạn là một thiên tài, tôi sẽ cung cấp cho bạn 100, nếu tôi có thể cho rằng câu trả lời. Cảm ơn bạn sooooooo nhiều !! –

+0

Chắc chắn 'SessionManager .Current.Connect (item);'? –

+0

Hehe, tất nhiên tôi phải thay thế "cái này" bằng "item". :-) –

3

Bạn có thể bọc các cuộc gọi trong một phương pháp chung chung, do đó lợi dụng suy luận kiểu của trình biên dịch:

private static void ConnectSessionManager<T>(T service) 
{ 
    SessionManager<T>.Current.Connect(service) 
} 

protected void ProcessInboundMessage() 
{ 
    // Connect 
    ConnectSessionManager(this); 
} 
Các vấn đề liên quan