代码之家  ›  专栏  ›  技术社区  ›  alexn

ASP.NET-重构操作

  •  1
  • alexn  · 技术社区  · 16 年前

    我有一个“问题”,我的许多控制器操作中都有这样的代码:

    var users = new List<SelectListItem>();
    foreach(var user in userRepository.GetAll())
    {
     var item = new SelectListItem { Text = user.FriendlyName, Value = user.UserId.ToString() };
    
     if (User.Identity.Name == user.UserName)
      item.Selected = true;
    
     users.Add(item);
    }
    
    ViewData["Users"] = users;
    

    如何将此重构为更干净的解决方案?我想变干!

    3 回复  |  直到 16 年前
        1
  •  2
  •   Chris Marisic    16 年前

    我将创建一个应用于 List<user> 或者不管你的userrepository.getall()返回了什么,那么在你的代码中,你可以用

    ViewData["Users"] = userRepository.GetAll().ToSelectList();
    

    编辑代码示例: 有两种方法可以做到这一点

    public static List<SelectListItem> ToSelectList(this List<Agent> users)
    {
        List<SelectListItem> items = new List<int>();
        foreach (var user in users)
        {
            var item = new SelectListItem { Text = user.FriendlyName, 
                                    Value = user.UserId.ToString() };
    
            if (User.Identity.Name == user.UserName)
                item.Selected = true;
    
            items.Add(item);
        }
    
        return items;
    }
    

    使用方法如下

    userRepository.GetAll().ToSelectList();
    

    或者如果在扩展方法中存在标识问题,

    public static List<SelectListItem> ToSelectList(this List<Agent> users, 
                                                            string selectedUserName)
    {
        List<SelectListItem> items = new List<int>();
        foreach (var user in users)
        {
            var item = new SelectListItem { Text = user.FriendlyName, 
                                    Value = user.UserId.ToString() };
    
            if (user.UserName == selectedUserName)
                item.Selected = true;
    
            items.Add(item);
        }
    
        return items;
    }
    

    使用方法如下

    userRepository.GetAll().ToSelectList(User.Identity.Name);
    
        2
  •  1
  •   Mark Seemann    16 年前

    把代码或部分代码放到一个单独的类中——让我们称之为用户服务。让userservice实现iuserservice:

    public interface IUserService
    {
        IEnumerable<SelectListItem> GetUsers();
    }
    

    通过构造函数注入将IUserService注入控制器:

    public MyController(IUserService userService)
    {
        this.userService = userService;
    }
    

    使用 userService 控制器操作中的字段以获取用户。

    public ViewResult DoSomething()
    {
        var users = this.userService.GetUsers();
        // the rest of the implementation
    }
    
        3
  •  0
  •   Nathan Taylor    16 年前

    您可以将该逻辑放在(抽象的)basecontroller中,然后从中派生所有控制器,并让它们调用basecontroller中的一个方法,以根据需要获取该数据。

    如果你需要加入 全部 您的控制器操作您也可以将它放在BaseController中重写的OnActionExecuting()中。