Обратный вызов на SaveChanges в EFCore? - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь сделать что-то похожее на мой DbContext:

public System.Action<IEnumerable<EntityEntry>> OnSave;

public override int SaveChanges() {
    if(OnSave != null)
         OnSave(ChangeTracker.Entries());

    return base.SaveChanges();
}

Затем DI (AutoFac) DbContext в другой класс, который может подключиться к функции 'OnSave'.

Я ищу единственный источник правды, когда это происходит.

Я не думаю, что это сработает или будет надежным, когда DbContext вводится в несколько мест, так как я почти уверенмы получаем несколько экземпляров DbContext для каждого места, в которое он введен.

1 Ответ

0 голосов
/ 29 января 2019

Похоже, вы хотите, чтобы ваш OnSave метод был одноэлементным (тот же метод, который используется во всех случаях вашего DbContext).

Один из способов решить эту проблему - переместить Action вновый класс:

public class MySaveEventHandler {
     public System.Action<IEnumerable<EntityEntry>> OnSave;
}

Затем добавьте его как одиночный файл в ваш Startup.cs, чтобы сделать его доступным для внедрения зависимостей:

services.AddSingleton<MySaveEventHandler>();

Затем измените ваш DbContext конструктор, чтобы он принималчерез DI и используйте это в вашем методе SaveChanges:

MySaveEventHandler _mySaveEventHandler;

public MyDbContext(DbContextOptions<MyDbContext> options, MySaveEventHandler mySaveEventHandler) : base(options) {
    _mySaveEventHandler = mySaveEventHandler;
}

public override int SaveChanges() {
    if(_mySaveEventHandler.OnSave != null)
         _mySaveEventHandler.OnSave(ChangeTracker.Entries());

    return base.SaveChanges();
}

Чтобы установить метод OnSave, вы просто получаете свой единственный экземпляр MySaveEventHandler через DI и устанавливаете его.Тогда каждый экземпляр вашего DbContext будет использовать его.

Примечание: вы можете использовать событие вместо делегата.На самом деле я не думаю, что это будет иметь большое функциональное значение, но здесь есть кое-что интересное: https://docs.microsoft.com/en-us/dotnet/csharp/distinguish-delegates-events

...