让我们想象一下以下情况(我将通过假装只有模型和视图/业务层来简化这种情况)
我使用的是实体框架(),我希望将所有更改以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将实例化这个将要调用我的Logger的LogContext。
如果我有两个项目,一个用于模型,另一个用于我的视图/业务(例如,我的视图/业务),并且我希望能够在我的Logger类中获得记录的用户,即使Model层不知道是什么类型的视图/业务(MVC项目、Windows窗体等等)。
我的想法是发送一个Func<>作为参数,这个函数将使用户在视图/业务层(即使在模型上被调用时),但是这意味着重写所有的SaveChanges调用来发送这个函数。
我想知道是否有什么方法可以“注入”这个函数,而无需在整个项目中重写我的所有SaveChanges。
非常感谢。
发布于 2014-12-03 13:14:00
与其将用户返回给基本记录器(这将使其暴露于它不应该真正了解的概念),为什么不实现一个标记或附加信息系统呢?要扩展现有的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);
}
} 这将是一个相当灵活的解决方案。然后,您可以让注入器注入一个函数,该函数以自由格式返回一个字符串,其中包含与您需要的上下文相关的信息。
这相对于注入不同的实现(取决于所需要的类的位置)的好处是,在用户操作的上下文中调用低级别代码的时候可能会出现这样的情况。如果为特定类提供特定的记录器,则可能会丢失相关的上下文信息。如果您拥有一个始终检查用户上下文的func,则当记录器记录时,它将为存在上下文的任何调用找到上下文。
https://stackoverflow.com/questions/27272020
复制相似问题