我正在将很大的解决方案从NHibernate迁移到Entity Framework Core 2.2。现有的解决方案是将DDD与Domain模型中的所有BL一起使用。该业务逻辑严重依赖于某些对象,这些对象已添加到自定义PostLoadListener中的模型中,该对象已在Nhibernate Configuration中注册,并在每次从DB加载实体时触发。
我在EF中找不到相似之处。 EF中是否有任何方法可以注册一些自定义代码(例如事件处理程序),而每次从DB读取某些实体时都会触发这些代码?
所有域模型都从DomainModelBase继承,DomainModelBase包含(除其他属性外)CurrentUser,UserRights,ApplicationSettings,OrganizationSettings,UserSettings,Permissions等的只读版本。 这些属性由事件处理程序调用的特殊方法填充。它们大多数是从高速缓存中获取的,但它们取决于用户。
旧代码-从持久性安装程序中:
var cfg = new Configuration();
container.Register(Component.For<Configuration>().Instance(cfg));
cfg.ConfigureForSql(connectionString,
new LastChangedPreUpdateListener(container),
new LastChangedPreInsertListener(container),
new IPostLoadEventListener[] {
new CurrentUserPostLoadListener(container), //that's my handler
new DefaultPostLoadEventListener(),
});
旧代码-来自CurrentUserPostLoadListener:
public class CurrentUserPostLoadListener : NhListenerBase, IPostLoadEventListener
{
...
public void OnPostLoad(PostLoadEvent @event)
{
// some checks...** Step 0: preprequires and checks
if (!(@event.Entity is EntityBase eb))
return;
...
//** Step 1: get current User (domain model of User)
...
//** Step 2: get other entities (UserRoles, OrganizationSettingsModel, UserSettingsModel)
...
//** Step 3: Set EnvironmentVariables of EntityBase
eb.SetEnvironmentVariables(user, userRoles, organizationSettingsModel, userSettingsModel, App.Settings);
}
}
最简单的解决方案可能是在每次从DbContext读取数据后调用某种方法(例如SetEnvironmentalVariables(...))。也许我应该把它放到UnitOfWork里面...但是那不像在基础设施中做的那样干净。 而且我真的不想在DomainModels上使用其他参数来调用方法,因为它与DDD范例直接相反。
对于这个问题,必须有其他简单的解决方案。