Я только начал использовать и влюбился в шаблон дизайна MVC.MVC Уменьшение повторяющегося кода
Мое единственное домашнее животное, похоже, что оно производит много повторяющегося кода. Например.
У меня есть стандартное приложение MVC с моей БД (модели) в одном проекте, отделенное от моих контроллеров/представлений/режимов просмотра в другом, снова отделенное от моих методов тестирования в другом. Все отлично работает.
Модели: Теперь у меня есть куча классных классов EF4 в моем проекте БД, который я должен использовать ViewModels для моего реального проекта для доступа к моим данным. Здесь нет проблем.
Контроллеры: Однако каждый контроллер, который у меня есть, по сути делает то же самое. Он получает и устанавливает данные из ViewModels, поэтому, когда каждый контроллер отличается тем, что он получает только разные данные, все они по существу выполняют одну и ту же работу, таким же образом. (У меня в настоящее время 9, но это может легко взорваться до более чем 50).
Например:
public class Dummy1Controller : Controller
{
private MyProj.Data.Entities _entities = new Data.Entities();
private MyProj.Data.Entities2 _coreEntities = new Data.Entities2();
//GET: /Customers/
public ActionResult Index()
{
if (_entities.table1.Count() == 0) return View();
var pastObj = _entities.table1.First();
return View(new Table1ViewModel()
{
Id = pastObj.Id,
FirstName = pastObj.FirstName,
LastName = pastObj.LastName,
.
.
.
.
});
}
}
public class Dummy2Controller : Controller
{
private MyProj.Data.Entities _entities = new Data.Entities();
private MyProj.Data.Entities2 _coreEntities = new Data.Entities2();
//GET: /Vehicles/
public ActionResult Index()
{
if (_entities.table2.Count() == 0) return View();
var pastObj = _entities.table2.First();
return View(new Table1ViewModel()
{
RegNo = pastObj.RegNo,
Make = pastObj.Make,
Model = pastObj.Model,
.
.
.
.
});
}
}
public class Dummy3Controller : Controller
{
private MyProj.Data.Entities _entities = new Data.Entities();
private MyProj.Data.Entities2 _coreEntities = new Data.Entities2();
//GET: /Invoices/
public ActionResult Index()
{
if (_entities.table3.Count() == 0) return View();
var pastObj = _entities.table3.First();
return View(new Table1ViewModel()
{
InvNo = pastObj.InvNo,
Amount = pastObj.Amount,
Tax = pastObj.Tax,
.
.
.
.
});
}
}
Просмотров: Каждый вид генерируется из contollers отлично работают. Execpt, что единственное, что меняется, это данные (поля с метками и текстовыми полями). Опять же, все они выполняют ту же работу (но с разными наборами данных).
@model MyProject.Web.ViewModels.Table1ViewModel
@{
ViewBag.Title = "Index";
}
<link href="@Url.Content("~/Content/CSS/GenericDetailStyles.css")" rel="stylesheet" type="text/css" />
<section id="content">
<div id="table">
<div>
<h2>Customer</h2>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.Id)</div>
<div class="right">@Html.TextBoxFor(model => model.Id)</div>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.FirstName)</div>
<div class="right">@Html.TextBoxFor(model => model.FirstName)</div>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.LastName)</div>
<div class="right">@Html.TextBoxFor(model => model.LastName)</div>
</div>
.
.
.
.
</div>
</section>
@{Html.RenderAction("Index", "FooterPartial");}
--------------------------------------------------------------------------------------
@model MyProject.Web.ViewModels.Table2ViewModel
@{
ViewBag.Title = "Index";
}
<link href="@Url.Content("~/Content/CSS/GenericDetailStyles.css")" rel="stylesheet" type="text/css" />
<section id="content">
<div id="table">
<div>
<h2>Vehicle</h2>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.RegNo)</div>
<div class="right">@Html.TextBoxFor(model => model.RegNo)</div>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.Make)</div>
<div class="right">@Html.TextBoxFor(model => model.Make)</div>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.PatientID)</div>
<div class="right">@Html.TextBoxFor(model => model.Model)</div>
</div>
.
.
.
.
</div>
</section>
@{Html.RenderAction("Index", "FooterPartial");}
--------------------------------------------------------------------------------------
@model MyProject.Web.ViewModels.Table3ViewModel
@{
ViewBag.Title = "Index";
}
<link href="@Url.Content("~/Content/CSS/GenericDetailStyles.css")" rel="stylesheet" type="text/css" />
<section id="content">
<div id="table">
<div>
<h2>Invoice</h2>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.InvNo)</div>
<div class="right">@Html.TextBoxFor(model => model.InvNo)</div>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.Amount)</div>
<div class="right">@Html.TextBoxFor(model => model.Amount)</div>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.Tax)</div>
<div class="right">@Html.TextBoxFor(model => model.Tax)</div>
</div>
.
.
.
.
</div>
</section>
@{Html.RenderAction("Index", "FooterPartial");}
Проблема: Я хочу сделать один контроллер, и сделать его динамичным. Чтобы он мог читать данные с разных моделей представлений. (Почему есть 9 или 50 контроллеров, которые в то же время выполняют одну и ту же работу)
Затем я хочу сделать то же самое с видами. Так что разные поля могут динамически генерироваться. (Почему 9 или 50 просмотров все выполняют ту же работу). Если представление основано на контроллере, представление должно иметь возможность изменять его свойства.
По существу все, что я хочу сделать, это найти способ сообщить контроллеру читать из режима просмотра X или VM - Y или VM - Z и он должен иметь возможность генерировать свойства, возвращать связанные данные и передавать их к представлению, которое после получения будет генерировать поля с надписями и текстовыми полями.
Я думаю, я хочу знать, есть ли способ сделать это с помощью отражения. Поскольку модели представления представляют собой базовые классы с простыми свойствами. Можно создать класс базового контроллера, который имеет метод для чтения в указанном объекте viewmodel, получать его свойства, читать также связанную таблицу и сопоставлять поля в этой таблице со свойствами в классе. Наконец, можно записать в таблицу из таблицы для отображения. Затем представление может быть сгенерировано автоматически на основе этого с использованием какой-либо бритвы, C# или javascript.
Любые приступы, если это возможно или нет, приветствуются.
Почему вы смешиваете шаблон MVC и MVVM? Я предполагаю, что я спрашиваю, для чего вам нужен ViewModel и не просто пройти модель? – Brunner
@Brunner - Ну во-первых, его способ, которым я был показан, и я не знаю, как это сделать напрямую (я относительно новичок в MVC). Во-вторых, мой работодатель хочет, чтобы это было сделано так. Наконец, когда я работаю над своими собственными проектами, я делаю это так, потому что мне не нравится иметь фактическую БД как часть проекта, как показано на многих примерах, и автоматически генерировать или регенерировать. Существует очень мало практических примеров, показывающих, как подключиться к реальной базе данных. Если вы знаете что-нибудь, я бы действительно использовал ссылки на них. Спасибо за ваш ответ. –
Я не уверен, что вы подразумеваете под «настоящими живыми dbs», но вы можете посмотреть на POCOs в сочетании с EF (например, Code-First) - это более или менее то, что у вас уже есть, просто аккуратно упаковано. Я также не уверен, что вы подразумеваете, не имея фактического БД в проекте, поскольку вы, например, можете сделать «return new View (pastObj)»; и вам даже не нужно редактировать представление (кроме объявления @model, хотя) – Brunner