我想添加一个事件监听器(IPreUpdateEventListener
)来添加NHibernate但是在使用流畅的配置时我似乎无法找到一个例子。
我希望能够在创建会话工厂时添加侦听器,例如当执行以下代码时。
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString).ShowSql())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<IEntity>())
.BuildSessionFactory();
任何人都知道怎么做?
答案 0 :(得分:32)
所以,迟到的回应,但为了后代,添加听众而不删除现有的注册听众(就像Bengt Be的早期回答一样):
var config = new Configuration ();
config.AppendListeners (ListenerType.PreUpdate, new [] { new AuditEventListener () });
等
答案 1 :(得分:13)
迟到的答案,当我试图做同样的事情时发现了你的问题。找到了应该有效的解决方案:
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString).ShowSql())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Entity>())
.ExposeConfiguration(c => c.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] {new AuditEventListener()});
答案 2 :(得分:6)
在这里复活死者,但是:
........
.ExposeConfiguration(c => c.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] {new AuditEventListener()});
应该是:
.ExposeConfiguration(c => c.AppendListeners(ListenerType.PreUpdate, new object[]
{
new AuditEventListener()
});
我相信'SetListener'方法(在另一个答案中描述)也会删除所有以前的侦听器。
如果你想做一些更有活力的事情,你可以这样做:
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
});
}
});
}
然后打电话给这样的话:
AddListenerToConfiguration<AuditEventListener>(smFactory,
ListenerType.PreUpdate);
这样可以在查看Fluent配置时提供更清晰的代码。它还允许您轻松地将单个类型注册到多个侦听器类型。
至于删除默认侦听器,除非我有一个从默认侦听器实现继承的侦听器并在重写方法上调用base.METHODNAME或复制与默认侦听器相同的行为,否则我不会删除它们。 / p>