Доступ к объектам базы данных из контроллера [закрыто]

ТЛ; др

В хорошем дизайне. Должен ли доступ к базе данных обрабатываться на отдельном уровне бизнес-логики (в модели asp.net MVC), или это нормально для передачиIQueryableс илиDbContext объекты к контроллеру?

Зачем? Каковы плюсы и минусы каждого?

m построение приложения ASP.NET MVC на C #. Оно используетEntityFramework как ORM.

Позволять'немного упростить этот сценарий.

У меня есть таблица базы данных с милыми пушистыми котятами. У каждого котенка есть ссылка на изображение котенка, индекс пушистости котенка, имя котенка и идентификатор котенка. Они отображаются на генерируемую EF POCO, называемуюKitten, Я мог бы использовать этот класс в других проектах, а не только в проекте asp.net MVC.

у меня естьKittenController который должен принести последних пушистых котят в/Kittens, Может содержать некоторую логику выбора котенка, но не слишком много логики. Я'Я спорил с другом о том, как реализовать это, я выигралт раскрыть стороны :)

Вариант 1: БД в контроллере:
public ActionResult Kittens() // some parameters might be here
{
   using(var db = new KittenEntities()){ // db can also be injected,
       var result = db.Kittens // this explicit query is here
                      .Where(kitten=>kitten.fluffiness > 10) 
                      .Select(kitten=>new {
                            Name=kitten.name,
                            Url=kitten.imageUrl
                      }).Take(10); 
       return Json(result,JsonRequestBehavior.AllowGet);
   }
}
Вариант 2: Отдельная модель
public class Kitten{
   public string Name {get; set; }
   public string Url {get; set; }
   private Kitten(){
        _fluffiness = fluffinessIndex;
   }

   public static IEnumerable GetLatestKittens(int fluffinessIndex=10){ 
        using(var db = new KittenEntities()){ //connection can also be injected
            return db.Kittens.Where(kitten=>kitten.fluffiness > 10)
                     .Select(entity=>new Kitten(entity.name,entity.imageUrl))
                     .Take(10).ToList();
        }
    } // it's static for simplicity here, in fact it's probably also an object method
      // Also, in practice it might be a service in a services directory creating the
      // Objects and fetching them from the DB, and just the kitten MVC _type_ here

}

//----Then the controller:
public ActionResult Kittens() // some parameters might be here
{
    return Json(Kittens.GetLatestKittens(10),JsonRequestBehavior.AllowGet);
}

Заметки:GetLatestKittens вряд ли будет использоваться в другом месте в коде, но это возможно. Это'можно использовать конструкторKitten вместо статического метода построения и изменения класса для котят. В основном этодолжен быть слоемвыше сущности базы данных, поэтому контроллер не должен знать о фактической базе данных, преобразователе или структуре сущности.

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

Примечание: конечно, альтернативные подходыочень ценится как ответы тоже.

Пояснение 1: Этоне тривиальное применение на практике. Это приложение с десятками контроллеров и тысячами строк кода, и сущности используются не только здесь, но и в десятках других проектов C #. Пример здесьсокращенный контрольный пример.

Ответы на вопрос(9)

Ваш ответ на вопрос