2011-08-09 35 views
5

Tôi có hai dự án. ProjectA có một lớp được gọi là Task và projectB có class gọi là Transmission. Tôi muốn rằng bất cứ khi nào truyền được thay đổi - một cái gì đó sẽ xảy ra trong Task và bất cứ khi nào Task được thay đổi - điều gì đó sẽ xảy ra trong Transmission.tương tác giữa các dự án

Đối với điều đó tôi đã tạo một dự án khác được gọi là Chung nơi cả ProjectA và projectB sẽ có tham chiếu đến. Nói chung, tôi đặt tất cả các giao diện để tương tác giữa cả hai thực thể.

Trong dự án chung tôi tạo giao diện được gọi là IManager mà ProjectA sẽ triển khai. Vai trò của người quản lý là xử lý các bản cập nhật. Giao diện nhìn như thế này:

public interface IManager 
{ 
    ITaskChangedHandler TaskChangedHandler { set; } 

    void OnTransmissionChanged(ITransmissionWithTasks transmission); 
} 

Giao diện này có 2 phương pháp PROJECTA có để thực hiện:

  1. void OnTransmissionChanged(ITransmissionWithTasks transmission); Khi có sự thay đổi trong quá trình truyền (bên ProjectB) phương pháp này được gọi là để thực hiện cập nhật trong các tác vụ.

  2. ITaskChangedHandler TaskChangedHandler { set; } Việc triển khai IManager phải được thiết lập cho ITaskChangedHandler. ITaskChangedHandler là một giao diện định nghĩa một phương pháp để truyền tải bản cập nhật trong trường hợp nhiệm vụ được thay đổi:

    public interface ITaskChangedHandler 
    { 
        void OnTaskChanged(string moduleName, ITask task, long transmissionId); 
    } 
    

Bây giờ, nó đi như thế này:

  1. PROJECTA có thực hiện để iManager.

  2. Bất cứ khi nào có một cahnge trong truyền tôi sử dụng StructureMap nhận thể hiện của thực hiện iManager và sau đó gọi OnTransmissionChanged();

  3. Đây là vấn đề của tôi - Bất cứ khi nào có sự thay đổi trong công tác (trong PROJECTA) Tôi muốn hãy gọi số TaskChangedHandler.OnTaskChanged() của IManager. Nhưng vấn đề là trường hợp triển khai IManager không đặt TaskChangedHandler.
    Tôi cũng không biết nơi tôi nên đặt TaskChangedHandler này:

    • này không thể ở trong PROJECTA vì nó không biết việc thực hiện ITaskChangedHandler.

    • Điều này không thể ở trong ProjectB vì việc tạo triển khai IManager xảy ra trong ProjectA, do đó, tập hợp phải nằm trong projectA.

    • Điều này không thể nằm trong Dự án chung vì nó không biết triển khai của IManager và ITaskChangedHandler.

Ai có thể giúp tôi giải quyết vấn đề này?

Trả lời

2

Đây là phương pháp nhanh chóng và dơ bẩn có thể khiến bạn suy nghĩ: một lớp tĩnh, được chia sẻ, bạn có thể xác định trong hội đồng được chia sẻ của mình.

public static class SharedEvents 
{ 
    public delegate void FirstEventHandler(); 
    public delegate void SecondEventHandler(); 

    public static event FirstEventHandler FirstEvent; 
    public static event FirstEventHandler SecondEvent; 

    public static void OnFirstEvent() 
    { 
     if (FirstEvent != null) FirstEvent(); 
    } 

    public static void OnSecondEvent() 
    { 
     if (!SecondEvent != null) SecondEvent(); 
    } 
} 

Một thanh ghi để xử lý các FirstEvent, khác để xử lý các SecondEvent: để gọi nhau, gọi OnFirstEvent() hoặc OnSecondEvent() cho phù hợp.

Đây là một đơn giản, và khá nghèo, thực hiện các mô hình Mediator:

http://en.wikipedia.org/wiki/Mediator_pattern

Với dependency injection, bạn có thể nhận được một thể hiện cho một đối tượng dựa trên một giao diện chia sẻ, quá. Ví dụ với Ninject, bạn có thể đăng ký một handler cho IFirst là một hằng số (ví dụ cụ thể của một cái gì đó thực hiện IFirst) và ngược lại. Sau đó, gọi Get<IFirst> để lấy.

+1

Bạn nghĩ gì là tốt hơn - sử dụng trình trung gian tĩnh (hoặc không tĩnh) hoặc sử dụng cả hai cách với tiêm phụ thuộc? – Naor

+0

Sau suy nghĩ thứ hai - người hòa giải này phải tĩnh. Mỗi dự án phải đăng ký các sự kiện và nếu nó không tĩnh thì sẽ không có cá thể nào để đăng ký. Tôi có đúng không? – Naor

+1

Không có gì phải là tĩnh nếu bạn sử dụng một singleton thông qua tiêm phụ thuộc, bạn chỉ có thể 'Nhận ' (ví dụ) và nhận được cùng một ví dụ trở lại. Tĩnh là khá xấu trong quan điểm của tôi. Người hòa giải sẽ phải tự đăng ký trước khi sử dụng nó. Điều đó nói rằng, bạn sẽ không cần một người hòa giải sử dụng DI, bởi vì nhiệm vụ có thể đăng ký chính nó như là việc triển khai ITask, truyền tải như truyền tải, và cả hai có thể truy cập lẫn nhau bằng DI ..? –

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