我正在尝试在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
的多个实例结束。
答案 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