2013-09-24 48 views
5

Tôi đang cố gắng để xuất bản một thông điệp như hình dưới đâyNServiceBus: Không thể tìm thấy Metadata cho (message)

_bus.Publish(new BatchCompleted { BatchId = batch.Id}); 

Và xử lý nó trong một BatchCompletedHandler:

public class BatchCompletedHandler: IHandleMessages<BatchCompleted> 
{ 

    public void Handle(BatchCompleted message) 
    { 
      Do Some Stuff... 
    } 
} 

Bất cứ khi nào tôi cố gắng và công bố tin nhắn Tôi nhận được System.Exception sau đây:

Không thể tìm thấy Siêu dữ liệu cho 'MyAssembly.BatchCompleted'. Thư cần phải triển khai 'IMessage', 'IEvent' hoặc 'ICommand'. Ngoài ra, nếu bạn không muốn thực hiện một giao diện, bạn có thể định cấu hình 'Thông điệp Chế độ Không phô trương' và sử dụng quy ước để định cấu hình cách các thư được ánh xạ.

Thông điệp không thực hiện IEvent như hình dưới đây

[Serializable] 
public class BatchCompleted : IEvent 
{ 
    public int BatchId{ get; set; } 
} 

Tôi cấu hình NSB sử dụng đoạn mã sau

Configure.With(MyAssembly) 

Việc xử lý thông điệp là trong lắp ráp MyAssembly và các thông điệp trong MyMessagesAssembly.

Tôi đang làm gì sai?

+0

Bạn có thể đăng cấu hình của mình không? Bản đồ UnicastBusConfig của bạn có được định cấu hình thích hợp không? Là tin nhắn của bạn lắp ráp bằng cách sử dụng cùng một phiên bản .net? tức là trình xử lý của bạn sử dụng .net 4.0 và thư của bạn là .net 4.5? –

+0

Cảm ơn Indu, cho con trỏ. Đó là cấu hình gây ra vấn đề! –

Trả lời

5

NServiceBus không thể tìm thấy loại thông báo đang được sử dụng. Các thông điệp nằm trong một hội đồng riêng biệt nhưng cấu hình làm cho NSB chỉ quét lắp ráp được chỉ định (MyAssembly) chứ không phải là hành vi mặc định của việc quét tất cả các cụm trong thư mục nhị phân.

Thay đổi cấu hình để

Configure.With() 

sẽ quét tất cả các assembly và cho phép NSB để tìm ra các loại tin nhắn được yêu cầu.

Tôi nghĩ rằng thông báo lỗi có một chút gây hiểu nhầm!

2

Trong NSB 5 bạn có thể quét tất cả các assembly sử dụng AssembliesToScan như được giải thích trong NServiceBus doc: http://docs.particular.net/nservicebus/hosting/assembly-scanning

Nếu bạn đã xác định không gian tên công ước, hãy chắc chắn rằng tất cả các quy tắc là chính xác:

config.Conventions() 
      .DefiningCommandsAs(t => t.Namespace != null && t.Namespace.StartsWith("...")) 
      .DefiningEventsAs(t => t.Namespace != null && t.Namespace.StartsWith("...")) 
      .DefiningMessagesAs(t => t.Namespace != null && t.Namespace.StartsWith("...")); 

Tôi hy vọng điều này sẽ hữu ích