Есть ли что-нибудь вроде IPostLoadEventListener в Entity Framework Core - PullRequest
0 голосов
/ 02 июля 2019

Я перевожу довольно большое решение с NHibernate на Entity Framework Core 2.2.Существующее решение использует DDD со всеми BL в моделях домена.Эта бизнес-логика сильно зависит от некоторых объектов, которые добавляются в модели в пользовательском PostLoadListener, который зарегистрирован в Nhibernate Configuration и запускается каждый раз, когда объект загружается из БД.

Я не могу найти ничего подобногов EF.Есть ли способ в EF зарегистрировать некоторый пользовательский код (например, обработчик событий), который будет запускаться каждый раз, когда какая-либо сущность считывается из БД?

Все доменные модели наследуются от 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);
    }
}

Возможно, простейшим решением будет вызов некоторого метода (например, SetEnvironmentalVariables).(...)) после каждого чтения из DbContext.Может быть, я должен положить это внутри UnitOfWork ... Но это не так чисто, как делать то же самое из инфраструктуры.И я действительно не хотел бы вызывать методы для DomainModels с дополнительными параметрами, потому что это прямо противоположно парадигме DDD.

Должно быть другое простое решение этой проблемы.

...