asp.net vs asp.net 核心 - 作为引用传递的对象不会在核心中更新

asp.net vs asp.net core - object passed as reference does not get updated in core

我使用 service/repository 模式和验证,如 this tutorial 中所述。服务有一个 ValidationDictionary 属性.

   public interface IValidationDictionary
    {
        void AddError(string key, string errorMessage);
        bool IsValid { get; }
    }

服务被注入到控制器的构造函数中。在构造函数的主体中,设置了 validationdictioary 属性。我使用包装器 class 来包装控制器的模型状态。

 public AuthenticationController(
        IOptionsMonitor<PasswordOptions> optionsAccessor,
        AppUserService appUserService,
        ILogger<AuthenticationController> logger, IConfiguration config) : base(logger, config)
    {
        _passwordOptions = optionsAccessor.CurrentValue;
        _appUserService = appUserService;
        _appUserService.ValidationDictionary = new ModelStateWrapper(ModelState);
    }

   public class ModelStateWrapper : IValidationDictionary
    {
        private readonly ModelStateDictionary _modelState;

        public ModelStateWrapper(ModelStateDictionary modelstate)
        {
            _modelState = modelstate;
        }

        public void AddError(string key, string errorMessage)
        {
            _modelState.AddModelError(key, errorMessage);
        }

        public bool IsValid => _modelState.IsValid;
    }

在服务中,当验证出错时,我将错误添加到验证字典中。

ValidationDictionary.AddError("", ErrorMessages.PasswordIsRequired);

当验证字典包含任何错误时,将抛出 DataValidationException。

    if (!ValidationDictionary.IsValid)
    {
        throw new DataValidationException();
    }

在控制器中捕获该异常以使用模型状态中的额外错误更新视图。

这种方法在 asp.net 中运行良好,但在 asp.net 核心中它不再起作用。

当我检查服务中的验证字典时,它包含所有预期的错误。在捕获到异常后回到控制器中,ModelState 所在的状态是原始状态 = 移动到服务之前的状态。

当我将模型状态到验证字典的分配从构造函数移动到动作的顶部时。它工作正常。

      public async Task<IActionResult> Register(RegisterVM VM)
        {
            try
            {
                _appUserService.ValidationDictionary = new ModelStateWrapper(ModelState);
....

这很容易出错,所以绝对不可取。

作为一种解决方法,我为只有 getter 的服务添加了 属性。

  protected AppUserService AppUserService
    {
        get
        {
            if (_appUserService.ValidationDictionary == null)
            {
                _appUserService.ValidationDictionary = new ModelStateWrapper(ModelState);
            }
            return _appUserService;
        }
    }

对更好的解决方案有什么建议吗?

创建控制器时会创建模型状态,但调用方法时也会创建模型状态。因此,引用在控件创建时创建的模型状态,实际上是引用调用方法时不会更新的模型状态。

解决方案仅在您调用该方法时引用模型状态。因此,提到的解决方法是实际的最终解决方案。