Entity framework IoC容器应该解析或映射器容器吗?

Entity framework IoC容器应该解析或映射器容器吗?,entity-framework,orm,inversion-of-control,unity-container,Entity Framework,Orm,Inversion Of Control,Unity Container,我已经配置了我的IoC容器Unity,以在我的工作单元的构造函数中解析我的IDbContextEntityFramworkDbContext 我想知道这是否是最佳实践,或者我只是在未来遇到了一个令人头疼的问题。这是一个ASP.NETMVC应用程序,因此将有很多短生命容器。每个容器的生存期为每个请求 有什么建议吗 public class UnitOfWork : IUnitOfWork { private readonly IDbContext context; public

我已经配置了我的IoC容器Unity,以在我的工作单元的构造函数中解析我的
IDbContext
EntityFramwork
DbContext

我想知道这是否是最佳实践,或者我只是在未来遇到了一个令人头疼的问题。这是一个ASP.NETMVC应用程序,因此将有很多短生命容器。每个容器的生存期为每个请求

有什么建议吗

public class UnitOfWork : IUnitOfWork
{
    private readonly IDbContext context;

    public UnitOfWork(IDbContext context)
    {
        this.context = context;
    }
}

public class SampleService : ISampleService
{
    private readonly IUnitOfWork unitOfWork;

    public SampleService(IUnitOfWork unitOfWork)
    {
        this.unitOfWork = unitOfWork;
    }
}

最好由容器管理IDbContext,并将其设置为PerRequest lifetime。您的代码看起来很干净,可以很容易地由IoC容器管理

作为@Steven,通常的做法是使用装置或工作并立即处理


如果Unity IoC容器可以正确配置为在请求结束时处理IDbContext,那么最好是这样。在使用ASP.NET的某些情况下,您可能必须在Application_EndRequest()中进行处理。

我认为您的解决方案很好,尽管Unity文档中有一条关于使用每请求生存期管理器的警告:。我认为,只要你知道自己在做什么,你就可以按照预期使用终身管理器。您可以使用的另一个选项是创建基本控制器并在该控制器上实现IDisposable。MVC将在请求的最后调用控制器上的dispose,因此您也可以这样处理任何对象。

相关:您当然不应该为每个请求构建一个容器,因为这会对应用程序的性能和配置的复杂性产生严重的负面影响。尽管使用Unity的子容器功能很好,但通常仍然是不需要的,而且性能很高。IoC容器不是根据请求生成的,IoC容器是一次性构建的,就像在应用程序的生命周期中一样。我的
DbContext
是针对每个请求的,因此每个服务调用只有一个IUnitOfWork,因此所有的DbContext都是相同的。每个服务调用都被视为单线程。