Asp.net mvc 4 如何正确处理已向Autofac注册的对象

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

如前所述,我已经实现了工作单元/存储库模式,但我也使用了autofac和构造函数注入,所以我注册了UnitOfWork和DbContext(PsyProfContext)类,如下所示:

 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();