2009-09-16 27 views
15

Tôi muốn thêm trình xử lý sự kiện (IPreUpdateEventListener) để thêm NHibernate nhưng dường như tôi không thể tìm thấy ví dụ khi sử dụng cấu hình thông thạo.Làm cách nào để thêm trình xử lý sự kiện thông qua Fluent NHibernate?

Tôi muốn có thể thêm người nghe khi tạo nhà máy phiên, ví dụ: khi mã sau được thực hiện.

_sessionFactory = Fluently.Configure() 
    .Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString).ShowSql()) 
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<IEntity>()) 
    .BuildSessionFactory(); 

Bất kỳ ai biết cách thực hiện việc này?

Trả lời

12

Trả lời muộn, tìm thấy câu hỏi của bạn khi tôi cố gắng làm như vậy. Tìm thấy một giải pháp mà nên làm việc:

_sessionFactory = Fluently.Configure() 
    .Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString).ShowSql()) 
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Entity>()) 
    .ExposeConfiguration(c => c.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] {new AuditEventListener()}); 
+3

Hãy rất cẩn thận với mã đó. Bạn đang thực sự xóa người nghe sự kiện hiện tại thay vì chỉ thêm người xem của riêng bạn vào danh sách. Tôi vừa phát hiện ra rằng nếu tôi thử sử dụng khóa lạc quan trong FluentNH (sử dụng ánh xạ Version), nó sẽ không hoạt động vì nó tự động đăng ký một số trình lắng nghe sự kiện và mã bạn cung cấp sẽ loại bỏ chúng. –

+1

OK, chỉnh sửa: Tôi đã ghi đè những người nghe sai để kiểm tra. Nhưng vẫn còn câu hỏi của tôi vẫn còn: là nó khôn ngoan để giả sử bạn có thể loại bỏ bất kỳ người nghe hiện có khi gọi ExposeConfiguration? –

31

Vì vậy, phản ứng muộn, nhưng vì lợi ích của hậu thế, để thêm người nghe mà không cần tháo thính giả đăng ký hiện có (như câu trả lời sớm từ Bengt Be sẽ làm):

var config = new Configuration(); 
config.AppendListeners (ListenerType.PreUpdate, new [] { new AuditEventListener() }); 

, vv

+0

Điều này có hiệu quả đối với tôi, ngoại trừ việc nó kết thúc việc thêm người nghe hai lần. Phải có điều gì đó sai với cấu hình của tôi. Thiết lập thay vì phụ thêm làm việc ở chỗ nó chỉ gọi phương thức OnPreUpdate một lần. – shanabus

6

Đang phục hồi người chết ở đây nhưng điều này:

........ 
    .ExposeConfiguration(c => c.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] {new AuditEventListener()}); 

Nên:

.ExposeConfiguration(c => c.AppendListeners(ListenerType.PreUpdate, new object[] 
    { 
     new AuditEventListener() 
    }); 

tôi tin rằng phương pháp 'SetListener' (được mô tả trong câu trả lời khác) cũng sẽ loại bỏ tất cả các thính giả trước.

Nếu bạn là thành một cái gì đó một chút năng động hơn, bạn có thể làm điều này:

private void AddListenerToConfiguration<T>(FluentConfiguration config, params ListenerType[] typesForListener) 
     where T : class 
    { 
     var listener = Activator.CreateInstance<T>(); 

     config.ExposeConfiguration(x => 
      { 
       foreach (var listenerType in typesForListener) 
       { 
        x.AppendListeners(listenerType, new T[] 
        { 
         listener 
        }); 
       } 
      }); 
    } 

Và sau đó gọi một cái gì đó như thế này:

AddListenerToConfiguration<AuditEventListener>(smFactory, 
      ListenerType.PreUpdate); 

Điều này cho phép mã sạch hơn trong khi bạn đang xem xét cấu hình Fluent. Nó cũng cho phép bạn dễ dàng đăng ký một loại duy nhất cho nhiều loại trình nghe. Để xóa các trình lắng nghe mặc định, tôi sẽ không xóa chúng trừ khi tôi có một người nghe kế thừa từ việc thực hiện trình lắng nghe mặc định và gọi base.METHODNAME trên các phương thức ghi đè hoặc sao chép cùng một hành vi giống như của các trình lắng nghe mặc định.

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