加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

.net – 简单注入器“由于在MVC验证期间已经处理了DbContext,因

发布时间:2020-12-16 03:29:59 所属栏目:asp.Net 来源:网络整理
导读:我有一个非常复杂的问题.我在ASP.NET MVC 5项目中使用FluentValidation.MVC.在其中,我使用存储库模式来检查用户的电子邮件地址是否不重复.问题不在于存储库模式;这是存储库在运行时使用注入构造函数的实体框架上下文: public class SomeRepository{ //IEFCo
我有一个非常复杂的问题.我在ASP.NET MVC 5项目中使用FluentValidation.MVC.在其中,我使用存储库模式来检查用户的电子邮件地址是否不重复.问题不在于存储库模式;这是存储库在运行时使用注入构造函数的实体框架上下文:

public class SomeRepository
{
  //IEFContext is something I modified the T4 template to generate
  public SomeRepository(IEFContext context)
  {
    _context = context;
  }
}

该应用程序使用这种方法,它工作得很好. SimpleInjector连接我的EF上下文,其范围限定为使用Per ASP.NET Web请求(包装HttpContext.Items).

Dim httpLifecycle = New SimpleInjector.Integration.Web.WebRequestLifestyle(True)
container.Register(of IEFContext,EFContext)(httpLifecycle)

这里的应用没有问题,只是验证.当服务器收到post操作时,我得到的错误是“由于已经处理了DbContext,因此无法完成操作”.看来我不能在FluentValidation属性中使用任何与EF相关的代码,该属性在每个Web请求的基础上使用EF上下文.验证属性没有什么特别之处,它可以:

public class Val : AbstractValidator<Entity>
{
   public Val()
   {
       _repos = Container.GetInstance<ISomeRepos>();
       RuleFor(i => i.Email).Must((o,v) =>
       {
           _repos.HasDistinctEmail(o.ID,v);
       }
   }
}

由于存储在HttpContext.Items中,因此上下文应该与之前的请求一起死亡.知道发生了什么事吗?我知道通过将True设置为WebRequestLifecycle,我会在请求结束时处理EF上下文.我认为这是可取的.

解决方法

我最好的选择是在AppDomain(单例)的持续时间内缓存Val类的实例,这意味着它的构造函数只调用一次,因此它只解析一个ISomeRepos,导致该repo被提升为单例同样(以及它的所有依赖).

快速修复很简单,在委托中移动GetInstance调用:

public Val()
{
    RuleFor(i => i.Email).Must((o,v) =>
    {
        repos = Container.GetInstance<ISomeRepos>();
        repos.HasDistinctEmail(o.ID,v);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读