Đ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.
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. –
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? –