LINQ to SQL, Обобщение - PullRequest
       16

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

1 голос
/ 08 января 2009

Я изо всех сил пытаюсь понять это.

Я работаю над проектом ASP.NET MVC, используя LINQ to SQL для своего уровня данных. База данных состоит из 10 различных таблиц исключений, например, "Exceptions.LADM", "Exceptions.USB", "Exceptions.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? Это выглядит некрасиво, и я уверен, что есть лучший способ, о котором я не могу думать. Может быть, я подхожу к нему с неправильного угла.

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 08 января 2009

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

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 голос
/ 08 января 2009

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

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(....);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...