c# - Unity,使用语句和 PerRequestLifetimeManager

标签 c# entity-framework asp.net-mvc-4 unity-container

我在我的项目中使用 Unity。但是我不确定我是否应该使用 using 语句,因为我正在使用 PerRequestLifetimeManager

简单的例子:

注入(inject):

container.RegisterType<IDataContext, MyContext>(new PerRequestLifetimeManager());

用法:

class MyClass
{
     private readonly IDataContext _context;

     public MyClass(IDataContext context)
     {
           _context = context;
     }

     public string MyMethod()
     {
          // 1. Is this needed?
          using (var u = _context)
          {
               var customers = u.Set<Customer>().OrderBy(o => o.Name);
               // ........
          }

          // 2. OR can I just do this
          var customers = _context.Set<Customer>().OrderBy(o => o.Name);

当我在我的注入(inject)中使用 PerRequestLifetimeManager() 时,这是否否定了 using 语句的要求,因为无论如何都会在每个 http 请求之后处理上下文?

最佳答案

如果您使用 using,那么您将立即处置 DbContext,如果您尝试再次访问它,则会导致异常,因此第一种方法通常不是一个好主意。 2 会工作但是如果 DbContext 中出现问题怎么办,例如您想要保留的新数据将不符合数据库设计(例如索引)。在这种情况下,您将无法重新创建 DbContext。我的建议是注册然后解析 DbContexts 的工厂方法:

class MyClass
{
     private readonly Func<IDataContext> _contextFactory;

     public MyClass(Func<IDataContext> contextFactory)
     {
           _contextFactory = contextFactory;
     }

     public string MyMethod()
     {
           // 1. Is this needed?
           using (var u = _contextFactory())
           { 
               var customers = u.Set<Customer>().OrderBy(o => o.Name);
               // ........
           }
     }

关于c# - Unity,使用语句和 PerRequestLifetimeManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24009032/

相关文章:

c# - T4MVC 未将参数传递给基本 Controller ,因此生成的代码无法构建

javascript - 如何在mvc4中实现日期时间选择器

c# - XmlTextWriter 错误地写入控制字符

c# - 带有图标和复选框的 ToolStripControlHost。如何突出显示所选项目?在图标字段中添加图标?

c# - ASP.net MVC 3错误: CS0103

.net - EF4.3 + sqlite 多对多关系

c# - 使用自定义逻辑在 MVC 中对大量数据进行分页

c# - 为什么我们不能在 C# 中使用公共(public)字段进行数据绑定(bind)?

c# - 在多层应用程序的 DbContext 上使用 Ninject

asp.net-mvc - 类型 'System.Web.Mvc.MvcWebRazorHostFactory' 的表达式不能用于返回类型 'System.Web.WebPages.Razor.WebRazorHostFactory'