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