小编Pea*_*e87的帖子

如何正确处置通过 Autofac 注册的对象

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

 builder.Register(context => new PsyProfContext()).InstancePerHttpRequest();
 builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest();
Run Code Online (Sandbox Code Playgroud)

一切都很好!

除了一件事:我还使用企业库日志记录块,并且我已经实现了 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在 CustomTraceListener 类的 Write 方法中,我尝试解析 UnitOfWork:

DependencyResolver.Current.GetService<IUnitOfWork>() as UnitOfWork;
Run Code Online (Sandbox Code Playgroud)

但我得到一个已经被处置的实例!所以我设置了一些断点,发现控制器的Dispose方法是在CustomTraceListener类的Write方法之前调用的,所以最后我除了直接使用DbContext(PsyProfContext)之外没有找到其他解决方案:

public override void Write(object o)
    { …
Run Code Online (Sandbox Code Playgroud)

enterprise-library unit-of-work autofac repository-pattern asp.net-mvc-4

0
推荐指数
1
解决办法
4890
查看次数