Я перевожу довольно большое решение с 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.
Должно быть другое простое решение этой проблемы.