Asp.net - 重构行动

时间:2009-09-23 13:35:29

标签: c# .net asp.net refactoring dry

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

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 个答案:

答案 0 :(得分:2)

我会将此创建为应用于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);

答案 1 :(得分:1)

将代码或部分代码放入一个单独的类中 - 让我们称之为UserService。让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
}

答案 2 :(得分:0)

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

如果您需要将它包含在 ALL 控制器操作中,您还可以将它放在BaseController中的重写OnActionExecuting()中。