Я немного пытаюсь понять это.
Я работаю над проектом ASP.NET MVC, используя LINQ to SQL для своего уровня данных. База данных состоит из 10 или около того различных таблиц "исключений", например «Исключения.LADM», «Исключения.USB», «Исключения.GPO». В основном эти таблицы отслеживают информацию о пользователе + машине для ослабления различных процедур безопасности.
Моя модель LINQ to SQL создана. У меня есть разные классы для каждой таблицы. Однако я не уверен, как использовать их в контроллере без необходимости создавать отдельные действия контроллера для каждого типа исключения. Для действия List я хочу сделать что-то вроде этого:
// Example Request: /Exceptions/List/ladm
// Routing: Controller = "Exceptions", Action = "List", type = "ladm"
// Controller Action:
public ActionResult List(string type)
{
string viewname = "List-" + type; // refer to "List-ladm" view.
if (type == "ladm")
{
var items = _repository.ListAllLADMExceptions();
}
return View(viewname, items);
}
Мой репозиторий реализует методы ListAll<XXXXXX>Exceptions для каждой таблицы. Есть ли способ избежать 10 различных операторов if / else? Это выглядит некрасиво, и я уверен, что есть способ лучше, о котором я не могу думать. Возможно, я подхожу к нему не с той точки зрения.
Любые предложения приветствуются.
Спасибо.





Вы можете попробовать диспетчеризацию динамических методов с помощью отражения (это довольно дорого с точки зрения производительности):
object items = _repository.GetType().GetMethod("ListAll"+type+"Exceptions")
.Invoke(_repository, null);
Однако я бы написал заявление switch (не if/else) для 10 случаев. Это не так уж плохо.
switch (type) {
case "ladm": return View("ladm", _repository.ListAllLADMExceptions());
case "....": return View(....);
}
Принятие его как окончательного, как размышление, кажется, лучше подходит для этого сценария. Я протестирую и посмотрю, насколько это дорого по сравнению с if / else или case / switch. Спасибо.
Типичный образец - один контроллер на стол. Как насчет разделения изменчивости на несколько классов контроллеров с использованием общего базового класса? Что-то вроде этого:
public abstract class ExceptionsBaseController<T> : Controller where T:class
{
protected abstract Table<T> ExceptionsTable { get; }
public virtual ActionResult List()
{
var items = ExceptionsTable;
return View(items);
}
}
Одно из преимуществ, как я вижу, было бы легче обрабатывать различия между классами исключений и добавлять новые. Это, вероятно, не поможет вашему общему количеству строк кода, но может пробудить идеи.
Однако это один из тех случаев, когда снижение производительности не так уж и плохо - вы выполняете 1 вызов отражения и несколько сетевых операций ввода-вывода (обработка запроса). Сетевой ввод-вывод - это ваша медленная часть, а не отражение. Может быть, если бы вы делали сотни вызовов рефлексии для каждого запроса, вам было бы все равно.