我已经实现了工作单元/存储库模式,如here所述,但我也使用autofac和构造函数注入,所以我注册了UnitOfWork和DbContext(PsyProfContext)类,如下所示:如何正确处理使用Autofac注册的对象
builder.Register(context => new PsyProfContext()).InstancePerHttpRequest();
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest();
而且一切都很好!
除了一件事情:我也使用enterprise library logging block,我已经实现了CustomTraceListener,它使用Entity Framework将日志条目写入数据库。
我的控制器看起来像这样(它是空的,因为在现阶段,我只是试图验证是否所有的东西(国际奥委会,记录,实体框架)的工作):
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);
}
}
而在Write方法CustomTraceListener类,我试图解决UnitOfWork:
DependencyResolver.Current.GetService<IUnitOfWork>() as UnitOfWork;
但我得到一个已经处置的实例!所以我已经放了一些断点,发现控制器的Dispose方法在CustomTraceListener类的Write方法之前调用,所以最终我没有发现直接使用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和Repository模式有什么意义。或者如果在某些情况下手动创建注册对象,在项目中使用DI有什么意义。
所以我想听听你的意见,关于如何处理这种情况?我现在的执行情况是否正常,或者肯定是错误的,我应该考虑另一个。
任何帮助将不胜感激,并欢迎任何想法!
这不是相关的,但你为什么要投你的服务?无论如何,你的服务没有解决的原因可能是因为HttpContext在你试图解决的时候是空的。 – maxlego
是否有任何理由需要将登录与工作单元联系起来?通常情况下,如果发生异常或检测到某个验证错误,则不会提交工作单元,但无论如何日志记录都应该成功。事实上,在错误情况下,日志记录最有价值! –
你对铸造完全正确,我没有注意到这一点。 – Peace87