2010-10-13 37 views
5

Tôi đang cố gắng thêm một triển khai IPostLoadEventListener vào cấu hình NHibernate của mình bằng cách sử dụng FluentNHibernate. Tôi có thể làm như vậy như minh họa ở đây:Trình nghe sự kiện NHibernate

how to add event listener via fluent nhibernate?

Tuy nhiên, việc tạo ra một mảng mới để thay thế cái cũ hoàn toàn loại bỏ bất kỳ người nghe sự kiện hiện có. Tôi có thể tham gia như vậy:

return Fluently.Configure() 
    .Database(config) 
    .Mappings(m => m.AutoMappings.Add(mappings)) 
    .ExposeConfiguration(cfg => 
     { 
      cfg.EventListeners.PostLoadEventListeners = 
       new IPostLoadEventListener[] { 
        new UtcDateEventListener(), 
        new DefaultPostLoadEventListener() // <<< this one is the default 
       }; 
      cfg.EventListeners.SaveOrUpdateEventListeners = 
       new ISaveOrUpdateEventListener[] { 
        new UtcDateEventListener(), 
        new DefaultSaveOrUpdateEventListener() // <<< this one is the default 
       }; 
     }) 
    .BuildConfiguration() 
    .BuildSessionFactory(); 

Nhưng tôi chỉ biết về trình xử lý sự kiện mặc định bằng cách bước qua mã để xác định nội dung tôi đã ghi đè. Tôi muốn thêm người nghe sự kiện của mình mà không ghi đè bất kỳ người nghe sự kiện hiện có nào, nhưng làm như vậy tôi đã trình bày ở trên dường như rất có mùi, đối với tôi. Trình lắng nghe sự kiện hiện có được hiển thị dưới dạng một mảng (chứ không phải là một bộ sưu tập hoặc danh sách, điều này sẽ có ý nghĩa hơn). Có cách nào sạch hơn để xử lý việc này không?

+0

Tuy nhiên, đây là một bài đăng cũ, nhưng tôi đã tìm thấy một liên kết thú vị tại đây: http://codebetter.com/petervanooijen/2015/04/13/using-nhibernate -eventlisteners-to-validate-and-audit-data/ – shankbond

Trả lời

5

Bạn có nghĩa là một cái gì đó như thế này:

using System.Linq; 

... 

var list = cfg.EventListeners.PostLoadEventListeners.ToList(); 
list.Add(new MyPostLoadEventListener()); 
cfg.EventListeners.PostLoadEventListeners = list.ToArray(); 

Điều đó sẽ làm việc :)

1

Bạn chỉ có thể mở rộng những mặc định ...

public class UtcDatePostLoadEventListener : DefaultPostLoadEventListener 
{ 
    public override void OnPostLoad(PostLoadEvent @event) 
    { 
     base.OnPostLoad(@event); 
    } 
} 

public class UtcDateSaveOrUpdateEventListener : DefaultSaveOrUpdateEventListener 
{ 
    public override void OnSaveOrUpdate(SaveOrUpdateEvent @event) 
    { 
     base.OnSaveOrUpdate(@event); 
    } 
} 

Nhưng, tôi không chắc chắn làm thế nào bạn có nghĩa vụ phải biết khi có một mặc định tại chỗ hay không. Ví dụ: không có gì cho PreUpdateEventListener ...

+0

Đó là vấn đề của tôi. Tùy thuộc vào mã tôi có nghĩa là tôi phụ thuộc vào hành vi không được xác định/liên kết rõ ràng và có thể thay đổi với việc triển khai trong tương lai. Ngoài ra, tôi đang thực hiện các giao diện trực tiếp để nếu tôi cần triển khai bổ sung trong tương lai, tôi không phụ thuộc vào một chuỗi chuỗi thừa kế. – Chris

+0

có lẽ tốt nhất để đi tuyến đường của mookid8000. Tôi đồng ý có nên có một phương pháp Add thay vì rối tung với mảng. Tôi biết tôi sử dụng một số phương thức của lớp Mặc định như 'GetEntityState' để tôi thấy dễ dàng hơn khi mở rộng. – dotjoe

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