我对创建依赖于某种持久数据存储(例如数据库/实体框架)的可重用组件的最佳方法感到烦恼。
例如,假设我想创建一个可重用的事件记录器,我只是通过 nuget 将其导入我的项目中。我希望它将其数据存储在主应用程序正在使用的同一数据库中,但我不想让记录器依赖于我的应用程序其余部分正在使用的数据上下文;这样做似乎会将组件与该特定应用程序联系起来。相反,我想知道它是否应该有自己的数据上下文,或者有另一个处理数据持久性的抽象......
我想我想问的问题是,在使用实体框架时,当它定义了一堆在我的主项目中存在的具体事物时,我如何对通用接口进行编程......?
public class SqlEventLogger : IEventLogger
{
private DataContext _ctx;
private Repository<ExceptionLog> repo;
public SqlEventLogger(DataContext ctx)
{
_ctx = ctx;
repo = new Repository<ExceptionLog>(ctx);
}
public void Log(string message, Severity severity, Exception exception = null, string requestType = null, string user = null, string location = null, string data = null)
{
repo.Add(new ExceptionLog
{
CreatedDate = DateTime.UtcNow,
Message = String.Format("{0} || {1}", message, exception.Message),
Source = exception.Source,
StackTrace = exception.StackTrace,
TargetSite = exception.TargetSite.ToString(),
RequestForm = data,
Url = location,
RequestType = requestType,
CurrentUser = user
});
_ctx.SaveChanges();
}
在这种情况下,DataContext 是我的代码优先 DbContext,而 ExceptionLog 是实体。