与HierarchicalLifetimeManager统一。我是否需要使用'实体框架声明

时间:2016-10-07 19:36:17

标签: entity-framework asp.net-web-api2 unity-container

我在Web API 2应用程序中使用Unity和Entity Framework。我使用HierarchicalLifetimeManager.

注册类型
var container = new UnityContainer();
container.RegisterType<IService, Service>(new HierarchicalLifetimeManager());

我是否需要将所有dbContext调用包装在这样的using语句中?这需要吗?我认为Unity会为我处理上下文。

using (var client = new dbContext())
{
     var result = client.Customers.toList();
}

或者我可以在没有using语句的情况下使用dbContext吗?

1 个答案:

答案 0 :(得分:0)

  

我是否需要将所有dbContext调用包装在using语句中   此?

我会说这取决于你如何使用你的上下文。举个例子:

public class Service : IService, IDisposable
{
    private DbContext _context;
    public Service(DbContext context)
    {
        _context = context;
    }

    public object Get(int id)
    {
        return _context.Customers.Find(id);
    }

    public object Update(object obj)
    {
        // Code for updating
    }

    public void Dispose()
    {
        _context.Dispose();
    }
}

如果您使用Service注册HierarchicalLifetimeManager,则context将永远不会被处置,因为没有任何内容会处置该服务,因此永远不会处置context。但是,上面的示例应该可以与TransientLifetimeManager一起使用。

来自MSDN

  

<强> HierarchicalLifetimeManager 即可。对于这个终身经理,至于    ContainerControlledLifetimeManager ,Unity返回相同的实例   每次调用Resolve或时注册的类型或对象   ResolveAll方法或依赖机制注入实例时   进入其他班级。

如果您将其置于每种方法中,那么无论您使用何种生命周期管理器,它都将被正确处理。此外,IService的消费者并不需要关心处置IService

public class Service : IService
{

    public object Get(int id)
    {
        using (var context = new DbContext())
        {
            return context.Customers.Find(id);
        }
    }

    public object Update(object obj)
    {
        // Code for updating
    }
}

另外,请考虑如果您的ServiceTransient会发生什么,并注入ContainerController的经理。由于经理从未被处理过,服务也都没有。管理器将在容器的整个生命周期内保留相同的服务实例。因此,我个人建议您继续在容器控件之外处理上下文。 如果你确保你有一系列的处置,那么在生命管理者的帮助下它可以很好地工作。有几个帖子herecodereview上显示了使用Unity来配置UoW的示例。