1

多くのコントローラーアクションに次のようなコードがあるという「問題」があります。

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;

これをよりクリーンなソリューションにどのようにリファクタリングしますか? DRYになりたい!

4

3 に答える 3

2

これを、適用される拡張メソッドList<user>または userRepository.GetAll() が返すものとして作成するので、コードでこれらの使用法をすべて置き換えることができます

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

編集コード サンプル:これを行うには 2 つの方法があります

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();

または、拡張メソッドに含まれる ID に問題がある場合は、

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);
于 2009-09-23T13:46:19.210 に答える
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
}
于 2009-09-23T13:47:21.860 に答える
0

そのロジックを (抽象) BaseController に配置し、そこからすべてのコントローラーを派生させ、必要に応じてそのデータを取得するために BaseController のメソッドを呼び出すことができます。

すべてのコントローラー アクションに含める必要がある場合は、BaseController のオーバーライドされた OnActionExecuting() に配置することもできます。

于 2009-09-23T13:43:27.173 に答える