回调EFCore中的SaveChanges?

时间:2019-01-29 01:22:19

标签: c# asp.net-core entity-framework-core autofac dbcontext

我正在尝试在DbContext中做类似的事情:

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

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

    return base.SaveChanges();
}

然后将DbContext DI(AutoFac)插入另一个可以连接到“ OnSave”功能的类。

发生这种情况时,我正在寻找一个真实的来源。

当将DbContext注入到多个位置时,我认为这不可行或不可靠,因为我敢肯定对于每个注入位置,我们都会以DbContext的多个实例结束。

1 个答案:

答案 0 :(得分:0)

听起来像您希望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方法,您只需通过DI来获取单个MySaveEventHandler实例并进行设置。然后您的DbContext的每个实例都将使用它。

旁注:您可以使用事件代替委托。确实,我认为这不会带来很大的功能差异,但是这里有一些有趣的读物:https://docs.microsoft.com/en-us/dotnet/csharp/distinguish-delegates-events