ASP .NET MVC 4 + EF
От: Alexandr Sulimov Украина www.ase.com.ua
Дата: 29.08.12 06:42
Оценка:
Возник такой вопрос.
Есть контроллер

    public class HomeController : Controller
    {
        private AppEntities db = new AppEntities();


И много методов (Action) которые работаеют с db.
Вопрос №1: Поскольку будет много обращений отразных клиентов, правильно ли использовать глобльную переменную в контроллере или лучше в каждом методе создавать новую переменную?
Вопрос №2: IIS и MVC и EF правильно организуют многпоточную работу с БД?
Вопрос №3: Поскольку бесплатные лицензии при подключении к IIS считаются анонимные подключения (те что не используют NT аутентификацию, используется аутентификация через Membership), то на счет подключений IIS к SQL — не ясно,
если используется аутентификация SQL Сервера это анонимное подключение?

Приветствуются ссылки на документацию.
... << RSDN@Home 1.2.0 alpha 4 rev. 1090>>
Re: ASP .NET MVC 4 + EF
От: Doc Россия http://andrey.moveax.ru
Дата: 29.08.12 10:52
Оценка: 6 (1) +1
Здравствуйте, Alexandr Sulimov, Вы писали:

AS>И много методов (Action) которые работаеют с db.


IMHO уже пошли не туда. И даже если EF рассматривать как DAL, то все равно не туда.
Action должен общаться с бизнес-логикой, а не с DAL. Описанное выше мне подсказывает, что у вас логика в контроллере. Вынесите её в отдельный слой (гуглите про трехслойную архитектуру).

AS>Вопрос №1: Поскольку будет много обращений отразных клиентов, правильно ли использовать глобльную переменную в контроллере или лучше в каждом методе создавать новую переменную?


По умолчанию — контроллер создается на каждый запрос каждого пользователя. Вывод сами сделаете?

AS>Вопрос №2: IIS и MVC и EF правильно организуют многпоточную работу с БД?


Насколько мне известно — EF не потокобезопасный.
Re[2]: ASP .NET MVC 4 + EF
От: mrozov  
Дата: 19.09.12 08:18
Оценка: 3 (1) +1 :)
Здравствуйте, Doc, Вы писали:

Doc>IMHO уже пошли не туда. И даже если EF рассматривать как DAL, то все равно не туда.

Doc>Action должен общаться с бизнес-логикой, а не с DAL.

Кому должен?
Re[3]: ASP .NET MVC 4 + EF
От: Doc Россия http://andrey.moveax.ru
Дата: 19.09.12 10:17
Оценка:
Здравствуйте, mrozov, Вы писали:

M>Кому должен?


Тому у кого занимал. Да еще с процентами.

Action в MVC это уровень Controller. Знание где хранятся данные, их получить, отсортировать и т.д. — это область Bussines Logic. Таким образом, написав в Action что-то вроде

public ActionResult Index()
{
    IEnumerable<SomeData> items;
    using (var db = new AppContext()) {
        items = db.SomeData
            .Where(d => d.Id == someId)
            .OrderBy(d => d.RecDate)
            .Take(10)
            .ToList();
    }

    return this.View(items);
}


вы вносите Bussines Logic в Controller, что противоречит идеи MVC.
Re[4]: ASP .NET MVC 4 + EF
От: mrozov  
Дата: 19.09.12 10:44
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Здравствуйте, mrozov, Вы писали:


M>>Кому должен?


Doc>Тому у кого занимал. Да еще с процентами.


Doc>Action в MVC это уровень Controller. Знание где хранятся данные, их получить, отсортировать и т.д. — это область Bussines Logic. Таким образом, написав в Action что-то вроде

...
Doc>вы вносите Bussines Logic в Controller, что противоречит идеи MVC.

ИМХО

Вы никогда не замечали, что в MVC есть буква M, но нет буквы "Bussines Logic"?

Так вот, когда вы вместо того, чтобы написать return db.Customers.Single(c=>c.CustomerID == custId), начинаете писать что-нибудь вроде return new CustBl().GetCustomer(custId), а в CustBl.GetCustomer, ясное дело, return new CustDAL().GetCustomer(custId), то в большинстве случаев вы платите проценты чужому дяде запросто так. Без всякого смысла. Совсем. Эти вложения никогда не окупятся. В лучшем случае, вы, со временем, их вернёте. В худшем — потеряете насовсем.

Это НЕ бизнес-логика. Бизнес-логика, это нечто совсем иное. И именно для такой логики (и подобной ей) в модели MVC и выделена отдельная сущность Controller, связывающая отображение с моделью. В противном же случае ваш контроллер вырождается в прокси к одноимённым BL-методам.

Т.е., иными словами, ваш настоящий Controller спрятан внутри BL, "что противоречит идеи MVC".

Хотя спорить не стану — подход действительно очень распространённый. Но не очень эффективный. А для приложений, в которых 40% кода — это чистые (или почти чистые) crud-ы, его использование можно оправдать разве что хорошо настроенной кодогенерацией.
Re[5]: ASP .NET MVC 4 + EF
От: Doc Россия http://andrey.moveax.ru
Дата: 19.09.12 12:27
Оценка:
Здравствуйте, mrozov, Вы писали:

M>Вы никогда не замечали, что в MVC есть буква M, но нет буквы "Bussines Logic"?


Все верно. Теперь уточним что есть M. Это данные и операции над ними (возьму описание из Wiki — The model consists of application data and business rules). Т.е. Bussines Logic как раз в данном случае входит в понятие модели.

Т.е. согласитесь, что в вашем примере с return db.Customers.Single(c=>c.CustomerID == custId) уже нарушено определение MVC.

Кроме того, такой строки в контроллере не будет. Будет что-то вроде return this.View(db.Customers....); И что из этого следует?

1) Усложняется тестирование этой самой Bussines Logic. Вместо метода, возвращающего список, вам надо тестировать данные зашитые во View.

2) А что если 2 или более разных View требуют один и тот же набор данных? Например для разных клиентов в разных форматах (html, json, xml). Вы напишите несколько дублей кода или метод. Первое приведет к усложенению сопровождения, второе — по сути начало создания BL слоя.

В общем, вспомните вообще зачем нужен MVC. Ну кроме модной строчки в резюме

M>Это НЕ бизнес-логика. Бизнес-логика, это нечто совсем иное.


А что?

M>И именно для такой логики (и подобной ей) в модели MVC и выделена отдельная сущность Controller, связывающая отображение с моделью.


Вот именно связывающая, а не "вычисляющая".

M>В противном же случае ваш контроллер вырождается в прокси к одноимённым BL-методам.


Вот тут согласен — в случаях простых сайтов зачастую Action выглядят в просто переадресацией. Но опять же это цель и назначение контроллера, это позволяет отделить модель в самостоятельную сборку и легко тестировать её. А контроллеры и должны быть тупыми и простыми.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.