gpt4 book ai didi

c# - 在引用的方法中注入(inject)一个要调用的方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:13:58 24 4
gpt4 key购买 nike

让我们想象一下下面的情况(我将假装只有模型和 View /业务层来简化这种情况)

我正在使用 Entity Framework,我想将所有更改作为 JSON 记录到日志表中。

我已经能够通过覆盖 DbContext.SaveChanges() 方法并读取 ChangeTracker() 来实现这一点。

这是一个例子:

public class LogContext : DbContext
{
public LogContext(string context)
: base(context)
{
}

public override int SaveChanges()
{
ChangeTracker.DetectChanges();
var added = ChangeTracker.Entries().Where(x => x.State == EntityState.Added).ToList();
var modified = ChangeTracker.Entries().Where(x => x.State == EntityState.Modified).ToList();
var deleted = ChangeTracker.Entries().Where(x => x.State == EntityState.Deleted).ToList();

Logger.RecordAdded(added);
Logger.RecordModified(modified);
Logger.RecordDeleted(deleted);
}
}

我的 RealContext 将实例化这个将调用我的 LoggerLogContext

如果我有 2 个项目,一个用于模型,另一个用于我的 View /业务,并且我希望能够在我的 Logger 类中获取已记录的用户,即使模型层不知道哪种类型 View /业务调用它(MVC 项目、Windows 窗体等)

我的想法是发送一个 Func<> 作为参数,这个函数会让用户进入 View /业务层(即使在模型上被调用),但这意味着重写所有 SaveChanges 调用发送这个函数。

我想知道是否有某种方法可以“注入(inject)”此函数而无需重写整个项目中的所有 SaveChanges。

非常感谢。

最佳答案

与其将用户返回给基本记录器,这会使它接触到它不应该真正了解的概念,为什么不实现标记或附加信息系统呢?扩展现有的 LogContext:

public class LogContext : DbContext
{
private readonly Func<string> _getAdditionalInfoFunc;
public LogContext(string context, Func<string> getAdditionalInfoFunc)
: base(context)
{
_getAdditionalInfoFunc = getAdditionalInfoFunc;
}

public override int SaveChanges()
{
ChangeTracker.DetectChanges();
var added = ChangeTracker.Entries()
.Where(x => x.State == EntityState.Added).ToList();
var modified = ChangeTracker.Entries()
.Where(x => x.State == EntityState.Modified).ToList();
var deleted = ChangeTracker.Entries()
.Where(x => x.State == EntityState.Deleted).ToList();

string extraInfo = _getAdditionalInfoFunc != null
? _getAdditionalInfoFunc()
: string.Empty;

Logger.RecordAdded(added, extraInfo);
Logger.RecordModified(modified, extraInfo);
Logger.RecordDeleted(deleted, extraInfo);
}
}

这将是一个非常灵活的解决方案。然后,您可以让注入(inject)器注入(inject)一个函数,该函数以自由格式返回一个字符串,其中包含您需要的尽可能多的上下文相关信息。

根据需要它的类的位置注入(inject)不同实现的好处是,有时您的低级代码可能会在用户操作的上下文中被调用。如果您为特定类提供特定记录器,您可能会丢失相关的上下文信息。如果您有一个始终检查用户上下文的函数,那么当记录器记录时,它将为存在上下文的任何调用找到上下文。

关于c# - 在引用的方法中注入(inject)一个要调用的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27272020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com