Asp.net mvc 4 如何正确处理已向Autofac注册的对象
如前所述,我已经实现了工作单元/存储库模式,但我也使用了autofac和构造函数注入,所以我注册了UnitOfWork和DbContext(PsyProfContext)类,如下所示:Asp.net mvc 4 如何正确处理已向Autofac注册的对象,asp.net-mvc-4,repository-pattern,enterprise-library,autofac,unit-of-work,Asp.net Mvc 4,Repository Pattern,Enterprise Library,Autofac,Unit Of Work,如前所述,我已经实现了工作单元/存储库模式,但我也使用了autofac和构造函数注入,所以我注册了UnitOfWork和DbContext(PsyProfContext)类,如下所示: builder.Register(context => new PsyProfContext()).InstancePerHttpRequest(); builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePer
builder.Register(context => new PsyProfContext()).InstancePerHttpRequest();
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest();
在CustomTraceListener类的Write方法中,我尝试解析UnitOfWork:
DependencyResolver.Current.GetService<IUnitOfWork>() as UnitOfWork;
但我不喜欢这个解决方案!如果您直接访问DbContext对象,那么使用UnitOfWork和Repository模式有什么意义。或者,如果在某些情况下手动创建注册对象,那么在project中使用DI有什么意义
所以我想听听你的意见,关于如何处理这种情况?我当前的实现是否很好,或者它肯定是错误的,我应该考虑另一个
我们将非常感谢您的帮助,欢迎您提出任何建议 看起来您可能有一些问题 首先,如果您在控制器中手动处理工作单元对象,那么控制器应该在构造函数中使用
拥有的。当请求生存期被释放时,它将自动释放任何IDisposable
组件,包括控制器和任何已解析的依赖项,除非您以某种方式指定您将接管生存期的所有权
externalyowned
还告诉Autofac您将控制处置。在这种情况下,您的控制器看起来就像已经存在一样。(一般来说,我喜欢让Autofac来做这项工作,如果可以避免的话,我不想拥有所有权。)
事实上,从设置方式来看,如果让Autofac为您处理,您可能完全可以避免处理问题-调用DependencyResolver
将返回尚未处理的工作单元,这样就可以了
如果这不能解决问题。。。您可能需要在问题中添加一些细节。我看到您的控制器在哪里使用工作单元类,但我没有看到它在哪里记录任何内容,也没有看到侦听器实现中使用工作单元的任何内容
(另外,正如在您问题的第一条评论中所指出的,在控制器的构造函数中,您不应该将服务从IUnitOfWork
转换为UnitOfWork
——这打破了接口最初提供的抽象。)看起来您可能有几个问题
首先,如果您在控制器中手动处理工作单元对象,那么控制器应该在构造函数中使用拥有的。当请求生存期被释放时,它将自动释放任何IDisposable
组件,包括控制器和任何已解析的依赖项,除非您以某种方式指定您将接管生存期的所有权
externalyowned
还告诉Autofac您将控制处置。在这种情况下,您的控制器看起来就像已经存在一样。(一般来说,我喜欢让Autofac来做这项工作,如果可以避免的话,我不想拥有所有权。)
事实上,从设置方式来看,如果让Autofac为您处理,您可能完全可以避免处理问题-调用DependencyResolver
将返回尚未处理的工作单元,这样就可以了
如果这不能解决问题。。。您可能需要在问题中添加一些细节。我看到您的控制器在哪里使用工作单元类,但我没有看到它在哪里记录任何内容,也没有看到侦听器实现中使用工作单元的任何内容
(另外,正如在您的问题的第一条评论中所指出的,在控制器的构造函数中,您不应该将服务从IUnitOfWork
转换为UnitOfWork
——这打破了接口最初提供的抽象。)这不相关,但您为什么要转换服务?无论如何,您的服务未解析的原因可能是因为您尝试解析时HttpContext为null。是否有任何原因需要将日志记录与工作单元联系起来?通常,如果抛出异常或检测到某些验证错误,则不会提交工作单元,但无论发生什么情况,日志记录都应该成功。事实上,在错误情况下,日志记录最有价值!你完全正确地选择了角色,我没有注意到这个。@default.kramer我同意你的观点,“无论发生什么,日志记录都应该成功”,这就是我配置多个侦听器的原因,我的意思是,此时异常将记录在windows事件日志和数据库中,因此所有异常详细信息都将保存到一个表中。此外,我还计划在将来添加一些其他侦听器,如电子邮件(如果问题严重)和登录到文件。这与此无关,但您为什么要发布您的服务?无论如何,您的服务未解析的原因可能是因为您尝试解析时HttpContext为null。是否有任何原因需要将日志记录与工作单元联系起来?通常,如果抛出异常或检测到某些验证错误,则不会提交工作单元,但无论发生什么情况,日志记录都应该成功。事实上,在错误情况下,日志记录最有价值!你完全正确地选择了角色,我没有注意到这个。@default.kramer我同意你的观点,“无论发生什么,日志记录都应该成功”,这就是我配置多个侦听器的原因,我的意思是,此时异常将记录在windows事件日志和数据库中,因此所有异常详细信息都将保存到一个表中。此外,我还计划在将来添加一些其他侦听器,如电子邮件(如果问题严重)和登录到文件
DependencyResolver.Current.GetService<IUnitOfWork>() as UnitOfWork;
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();
}
}
}
public class HomeController : Controller
{
Owned<IUnitOfWork> _uow;
public HomeController(Owned<IUnitOfWork> uow)
{
this._uow = uow;
}
protected override void Dispose(bool disposing)
{
if(disposing)
{
this._uow.Dispose();
}
base.Dispose(disposing);
}
}
builder
.RegisterType<UnitOfWork>()
.As<IUnitOfWork>()
.ExternallyOwned()
.InstancePerHttpRequest();