Как я могу использовать принцип СУХОГО в ASP.NET MVC для рефакторинга этого кода? - PullRequest
4 голосов
/ 25 марта 2009

У меня есть несколько методов в одном из моих контроллеров, которые делают это:

ViewData["Customers"] = LoadCustomers();
ViewData["Employees"] = LoadEmployees();
ViewData["Statuses"] = LoadStatuses();
etc......

Вот LoadCustomers (), но LoadEmployees, LoadStatuses и все остальные - это практически та же логика:

private static SelectList LoadCustomers()
    {
        IList<Customer> customers;
        try
        {
            IServiceCallService scService = new ServiceCallService();
            customers = scService.GetCustomers();
            Customer c = new Customer
            {
                ID = "",
                Name = "-- Select a Facility --"
            };
            customers.Insert(0, c);
        }
        catch
        {
            customers = new List<Customer>();
            Customer c = new Customer
            {
                ID = "",
                Name = "-- No Facilities on File --"
            };
            customers.Insert(0, c);
        }

        return new SelectList(customers, "ID", "Name");
    }

Как мне лучше написать этот код, чтобы мне не нужен новый метод каждый раз, когда я добавляю новый список выбора?

Ответы [ 3 ]

5 голосов
/ 25 марта 2009

Похоже, это может быть хорошим кандидатом на дженерики:

private static SelectList LoadItems<T>() where T : new, ... 
{                                                // Add any additional interfaces
                                                 // that need to be supported by T
                                                 // for your Load method to work,
                                                 // as appropriate.
    IList<T> items;
    try
    {
        IServiceCallService scService = new ServiceCallService();
        results = scService.Get<T>();  // You'll need to replace GetCustomers() with
                                       //   a generic Get<T> method.

        // ...
    }
    catch         // Really needed? What are you trying to catch here? (This catches
    {             //   everything silently. I suspect this is overkill.)
        // ...
    }

    return new SelectList(items, "ID", "Name");
}
0 голосов
/ 25 марта 2009

Я бы пошел еще дальше и написал бы это в коде контроллера:

 ViewData["Customers"] = new SelectList(
      new ServiceCallService().GetCustomers(),
      "ID","Name")

и это с учетом

<%= Html.DropDownList("Customers",
     ((SelectList)ViewData["Customers"]).Count() > 0 ? 
    "-- Select a Facility --" : "-- No Facilities on File --" ) %>
0 голосов
/ 25 марта 2009

Вы также можете попробовать более функциональный подход.

public IList<T> Load<T>(Func<IList<T>> getList, T prependItem)
{
    var list = getList();
    list.Insert(0, prependItem);
    return list;
}

Использование:

var prependItem = new Customer { ID = "", Name = "-- Select a Facility --" };
ViewData["Customers"] = new SelectList(
    Load(new ServiceCallService().GetCustomers(), prependItem),
    "ID", "Name");

Этот подход также отделяет построение списка от деталей того, что создается - список SelectList.

...