2012-04-18 39 views
7

Tôi đang tìm kiếm một thực hiện Java đơn giản sự kiện mô hình và cơ sở hạ tầng miền Udi Dahan như chi tiết trong this article. Nó là khá đơn giản và tôi đã thực hiện giải thích của riêng tôi, tuy nhiên tôi là một người mới Java và không muốn bị cắn bởi bất kỳ sai lầm do thiếu kinh nghiệm với ngôn ngữ.Triển khai mẫu Sự kiện miền trong Java?

Việc triển khai Java duy nhất mà tôi đã tìm thấy nằm trong số Jdon Framework, nhưng đó là một chút quá nặng đối với hiện tại của tôi trong dự án của tôi.

Cảm ơn!

Trả lời

1

Tôi hiện đang xem xét sử dụng Googles Guava EventBus để làm điều gì đó tương tự như "cứu rỗi" Điều bạn tham khảo.

Sử dụng nó tương tự như "Làm thế nào để nâng cao sự kiện miền" sẽ giống như thế này, gần như hoàn toàn giống như bài viết:

public class Customer 
{ 
    public void DoSomething() 
    { 
     MyEventBus.post(new CustomerBecamePreferred() { Customer = this }); 
    } 
} 

Tôi không biết hay không, bạn muốn xem xét việc này là "triển khai mẫu Sự kiện miền của Udi Dahan".

Nó không yêu cầu thực hiện bất kỳ giao diện; xử lý sự kiện được đánh dấu bằng chú thích và lớp được đăng ký với EventBus với MyEventBus.register(aListenerObject)

+0

Cảm ơn Stephen, điều đó khá thú vị-- Tôi không biết gì về ổi. Tôi thực sự đang cố gắng giữ cho miền của tôi không biết chi tiết thực hiện, nhưng tôi sẽ cho Guava EventBus một số suy nghĩ. Có lẽ tôi có thể bọc EventBus để ẩn việc thực hiện từ tên miền của tôi ... – HolySamosa

+0

Yeah @HolySamosa - Tôi sẽ bọc nó khi tôi đặt nó vào, nhưng giữ giao diện 'register()' và 'post()' đơn giản nó. –

+0

Tôi cho rằng bạn chỉ cần giữ chú thích Đăng ký Guava trong mô hình miền của mình? Tôi thích ý tưởng sử dụng chú thích cho các đăng ký ràng buộc, nhưng tôi không muốn cho phép một chi tiết triển khai thực hiện vào mô hình miền đẹp, sạch sẽ của tôi. – HolySamosa

5

Tôi đã tìm kiếm giải pháp cho cùng một vấn đề trong Java EE trong một thời gian. Tôi nhìn Axonjdon (trang không thực sự điềm lành hoặc :)). Cả hai liên quan đến tổ chức sự kiện Sourcing mà tôi không thể "bán" cho người sử dụng lao động/khách hàng của tôi. Tôi muốn có các sự kiện miền mặc dù kể từ khi tôi rất quen với chúng trong các dự án .NET/C#. Vì vậy, tôi đã đưa ra những điều sau đây ...

Tôi đã sử dụng đối tượng DomainEvents tĩnh tương tự để cấp cho tôi quyền truy cập vào cơ chế xuất bản mà không có chi tiết triển khai thực sự. Vì vậy, các cuộc gọi một cái gì đó như thế này:

DomainEvents.fire(new MySampleEvent(...some params...)); 

Một mô hình và cơ chế có sẵn trong CDI đặc tả là Events with @Observes cho phép bạn để đáp ứng với các sự kiện nhất định trong đậu bình thường với tất cả các dịch vụ có sẵn. Đó là tương tự như những gì tôi đã được sử dụng để khi sử dụng khuôn khổ DI như Castle Windsor nơi tôi có thể đăng ký xử lý chung bởi giao diện. Vì vậy, tôi đã có các nhà quan sát (người xử lý, người nghe, bất cứ điều gì bạn muốn gọi cho họ) được bảo hiểm. Ví dụ:

@Stateless 
public class MySampleEventObserver { 

    public void listen(@Observes MySampleEvent event) { 
    ... 
    doSomethingWithEvent(); 
    } 
} 

Bây giờ phần xuất bản (kích hoạt trong CDI). Kể từ khi không có cách nào để truy cập CDI vào đơn vị (với lý do chính đáng!) Tôi quyết tâm sử dụng JNDI và BeanManager. Tôi đã sử dụng JNDI để lấy BeanManager và sử dụng phương thức fireEvent.Để đặt quản lý đậu giải quyết (như seen here) trong mã:

public class BeanHelper { 
    public static BeanManager getBeanManager() { 
    try { 
     InitialContext initialContext = new InitialContext(); 
     return (BeanManager) initialContext.lookup("java:comp/BeanManager"); 
    } catch (NamingException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    } 

}

Bước cuối cùng là DomainEvents đối tượng chính nó:

public class DomainEvents { 

    private static boolean mNopMode = false; 

    public static void setNopMode() { 
    mNopMode = true; 
    } 

    public static void reset() { 
    mNopMode = false; 
    } 

    public static <TDomainEvent> void fire(TDomainEvent event) { 
    if (mNopMode) { 
     return; 
    } 
    BeanManager manager = BeanHelper.getBeanManager(); 

    manager.fireEvent(event); 
    } 

}

Các setNopModereset phần có mục đích thử nghiệm khi không có ngữ cảnh. Hướng dẫn sử dụng mocking cơ bản. Đặt nó vào chế độ hoạt động NOP trước khi kiểm tra đơn vị và thiết lập lại sau chúng.

Hoạt động tốt như POC. Không biết nếu có bất kỳ hạn chế nghiêm trọng để sử dụng nó mặc dù. Tôi để lại các tương tác bus không đồng bộ và tương tự như việc thực hiện trình lắng nghe.

Rất thích bất kỳ nhận xét nào.

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