【问题标题】:Passing ModelState to Business Layer将 ModelState 传递给业务层
【发布时间】:2013-10-16 01:08:06
【问题描述】:

我正在使用一个 ASP.NET MVC 网站,我们正在利用 DI 将必要的组件注入到我们的控制器中。

我目前面临的挑战是我想将服务提供者注入控制器,并将“UserRequestContext”对象注入服务提供者。

UserRequestContext 对象封装了当前用户 ID、电子邮件地址、角色,并且还传递了 modelstate 对象(或者至少,我希望这样)。我想在我的服务提供者层执行所有验证操作。

当然,问题是我的服务提供者对象必须在控制器之前实例化,并且因为 ModelState 在控制器创建之前不存在,所以我无法创建 UserRequestContext 对象。

我的目标是消除将 IUserRequestContext 对象传递给 IServiceProvider 的每个方法的需要。

取而代之的是: void ServiceProvider.CreateUser(User user, IUserRequestContext userRequestContext);

使用这个: void ServiceProvider.CreateUser(用户用户)

这是我目前编写的代码:

public class HomeController
{       
    public HomeController(IServiceProvider provider)
    {
        _provider = provider;
    }

    private IServiceProvider _provider;
}

public class ServiceProvider : IServiceProvider
{
    private IUserRequestContext _userRequestContext;

    public ServiceProvider(IUserRequestContext userRequestContext)
    {
        _userRequestContext = userRequestContext;
    }
}

public class UserRequestContext : IUserRequestContext
{
   private ModelStateDictionary _modelState;

   public UserRequestContext(ModelStateDictionary modelState)
   {
       _modelState = modelState;
   }

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

   // the rest removed for brevity
}

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    我看不出这有什么问题。我在我的代码中遵循了非常相似的模式。

    我创建了一个IModelState 接口,并将其传递到我的服务中。我为ModelStateDictionary 创建了一个扩展方法,将其封装到实现该接口的帮助类中。我现在可以这样做了:

    public class mycontroller
    {
        private readonly IService _service;
    
    ...
    
        public ActionResult myaction()
        {
            _service.dowork(ModelState.ToWrapper())
     ....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      相关资源
      最近更新 更多