实体框架核心中是否有类似IPostLoadEventListener的

时间:2019-07-02 13:26:55

标签: entity-framework domain-driven-design ef-core-2.2

我正在将很大的解决方案从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范例直接相反。

对于这个问题,必须有其他简单的解决方案。

0 个答案:

没有答案