LINQ to SQL, обобщение

Я немного пытаюсь понять это.

Я работаю над проектом 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? Это выглядит некрасиво, и я уверен, что есть способ лучше, о котором я не могу думать. Возможно, я подхожу к нему не с той точки зрения.

Любые предложения приветствуются.

Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
481
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете попробовать диспетчеризацию динамических методов с помощью отражения (это довольно дорого с точки зрения производительности):

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

Однако это один из тех случаев, когда снижение производительности не так уж и плохо - вы выполняете 1 вызов отражения и несколько сетевых операций ввода-вывода (обработка запроса). Сетевой ввод-вывод - это ваша медленная часть, а не отражение. Может быть, если бы вы делали сотни вызовов рефлексии для каждого запроса, вам было бы все равно.

Jonathan Rupp 08.01.2009 01:37

Принятие его как окончательного, как размышление, кажется, лучше подходит для этого сценария. Я протестирую и посмотрю, насколько это дорого по сравнению с if / else или case / switch. Спасибо.

Nasir 08.01.2009 23:24

Типичный образец - один контроллер на стол. Как насчет разделения изменчивости на несколько классов контроллеров с использованием общего базового класса? Что-то вроде этого:

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

Одно из преимуществ, как я вижу, было бы легче обрабатывать различия между классами исключений и добавлять новые. Это, вероятно, не поможет вашему общему количеству строк кода, но может пробудить идеи.

Другие вопросы по теме