Доступ к объектам базы данных из контроллера [закрыто]
В хорошем дизайне. Должен ли доступ к базе данных обрабатываться на отдельном уровне бизнес-логики (в модели asp.net MVC), или это нормально для передачиIQueryable
с илиDbContext
объекты к контроллеру?
Зачем? Каковы плюсы и минусы каждого?
m построение приложения ASP.NET MVC на C #. Оно используетEntityFramework как ORM.
Позволять'немного упростить этот сценарий.
У меня есть таблица базы данных с милыми пушистыми котятами. У каждого котенка есть ссылка на изображение котенка, индекс пушистости котенка, имя котенка и идентификатор котенка. Они отображаются на генерируемую EF POCO, называемуюKitten
, Я мог бы использовать этот класс в других проектах, а не только в проекте asp.net MVC.
у меня естьKittenController
который должен принести последних пушистых котят в/Kittens
, Может содержать некоторую логику выбора котенка, но не слишком много логики. Я'Я спорил с другом о том, как реализовать это, я выигралт раскрыть стороны :)
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 #. Пример здесьсокращенный контрольный пример.