我已经实现了工作单元/存储库模式,如此处所述,但我也在使用 autofac 和构造函数注入,所以我注册了 UnitOfWork 和 DbContext (PsyProfContext) 类,如下所示:
builder.Register(context => new PsyProfContext()).InstancePerHttpRequest();
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest();
一切都很好!
除了一件事:我也在使用企业库日志记录块,并且我已经实现了使用实体框架将日志条目写入数据库的 CustomTraceListener。
我的控制器看起来像这样(它是空的,因为目前我只是试图验证所有东西(IoC、日志记录、实体框架)是否都在工作):
public class HomeController : Controller
{
private readonly UnitOfWork unitOfWork;
public HomeController(IUnitOfWork unitOfWork)
{
this.unitOfWork = (UnitOfWork) unitOfWork;
}
//
// GET: /Home/
public ActionResult Index()
{
throw new HttpException();
return View();
}
protected override void Dispose(bool disposing)
{
unitOfWork.Dispose();
base.Dispose(disposing);
}
}
在 CustomTraceListener 类的 Write 方法中,我尝试解决 UnitOfWork:
DependencyResolver.Current.GetService<IUnitOfWork>() as UnitOfWork;
但是我得到了一个已经被处理的实例!所以我放了一些断点,发现在CustomTraceListener类的Write方法之前调用了控制器的Dispose方法,所以最后我没有找到直接使用DbContext(PsyProfContext)的其他解决方案:
public override void Write(object o)
{
using (var conext = new PsyProfContext())
{
var customLogEntry = o as CustomLogEntry;
if (customLogEntry != null)
{
var logEntry = new LogEntry
{
//a bunch of properties
};
conext.Exceptions.Add(logEntry);
conext.SaveChanges();
}
}
}
但我不喜欢这个解决方案!如果您直接访问 DbContext 对象,那么使用 UnitOfWork 和存储库模式有什么意义。或者,如果您在某些情况下手动创建注册对象,那么在项目中使用 DI 有什么意义。
所以我想听听你的意见,关于如何处理这种情况?我目前的实施是否良好,或者肯定是错误的,我应该考虑另一个。
任何帮助将不胜感激,欢迎任何想法!