Разница между контроллером MVC и бизнес-логикой (3 уровня) - PullRequest
6 голосов
/ 17 марта 2012

Я пытался найти разницу между MVC и 3-уровневой архитектурой в ASP.NET. Я сослался на некоторые предыдущие некоторые предыдущие вопросы и некоторые страницы, но мог найти четкий ответ.
Вот страница MSDN о реализации MVC: http://msdn.microsoft.com/en-us/library/ff647462.aspx

Считайте, у меня есть этот код:
Пользовательский интерфейс и код aspx на одной странице

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<html>
   <head>
      <title>start</title>
      <script language="c#" runat="server">
         void Page_Load(object sender, System.EventArgs e)
         {
            String selectCmd = "select * from Recording";

            SqlConnection myConnection = 
               new SqlConnection(
                  "server=(local);database=recordings;Trusted_Connection=yes");
            SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, 
               myConnection);

            DataSet ds = new DataSet();
            myCommand.Fill(ds, "Recording");

            recordingSelect.DataSource = ds;
            recordingSelect.DataTextField = "title";
            recordingSelect.DataValueField = "id";
            recordingSelect.DataBind();
         }
       </script>
   </head>
   <body>
         <asp:dropdownlist id="recordingSelect" runat="server" />
         <asp:button runat="server" text="Submit" OnClick="SubmitBtn_Click" />
      </form>
   </body>
</html>

Теперь рассмотрим, у меня есть разные файлы для
---- View и Code-behind выделены ----
.aspx

<%@ Page language="c#" Codebehind="Solution.aspx.cs" 
   AutoEventWireup="false" Inherits="Solution" %>
<html>
         <asp:dropdownlist id="recordingSelect" runat="server" />
      </form>
   </body>
</html>

.aspx.cs

using System;
using System.Data;
using System.Data.SqlClient;
public class Solution : System.Web.UI.Page
{
   private void Page_Load(object sender, System.EventArgs e)
   {
      if(!IsPostBack)
      {
         String selectCmd = "select * from Recording";
         SqlConnection myConnection = 
            new SqlConnection(
               "server=(local);database=recordings;Trusted_Connection=yes");
         SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, myConnection);
         DataSet ds = new DataSet();
         myCommand.Fill(ds, "Recording");
         recordingSelect.DataSource = ds;
         recordingSelect.DataTextField = "title";
         recordingSelect.DataValueField = "id";
         recordingSelect.DataBind();
      }
   }
  1. Видя указанную выше ссылку на страницу MSDN для класса Controller, я не могу различить разницу между бизнес-логикой (это было бы аналогично для среднего уровня в 3-уровневой архитектуре) и контроллер.
  2. 3-уровневый и MVC - это совершенно разные вещи? Являются ли приложения ASP.NET в Visual Studio уже отдельным файлом, как в форме MVC? Если они не отличаются, какой стиль предпочтительнее?
  3. Что такое инфраструктура MVC, если .aspx и .aspx.cs уже разделены?

Ответы [ 3 ]

5 голосов
/ 17 марта 2012

Я на самом деле долго боролся с этим, есть разные философии о том, как правильно его реализовать, поэтому я понимаю это своими собственными словами, как я понимаю отношение между различными задействованными вещами (Модели / Представления / Контроллеры / Бизнес-логика):

  • Просмотры
    Имеют весь код Html / jQuery, они используют данные в виде Model экземпляров, которые поступают из контроллера
  • Модель
    Классы, которые содержат информацию, необходимую для представления (список продуктов и т. Д.)
  • Контроллеры
    • Они принимают входящие запросы
    • Выполните необходимые приготовления (извлечение параметров и т. Д.), Чтобы вызвать действительный код бизнес-логики.
    • Затем вызовите код бизнес-логики и получите результат
    • После этого они берут результат и преобразуют его в модель, понятную пользовательскому интерфейсу
  • Бизнес-логика
    Это ваш реальный код бизнес-логики, вызывающий db и т. Д. Я считаю, что это полностью отделено от всей вещи MVC, на самом деле он даже не должен знать, что она выполняется из веб-приложения MVC. Обычно мы помещаем это в другую сборку (библиотеку классов), чтобы убедиться, что нет никакой зависимости от кода MVC.
    Это упрощает модульное тестирование только бизнес-логики, поскольку нет никаких зависимостей от MVC.

Я видел другие подходы, в которых бизнес-логика фактически вводится в контроллеры, но в моих глазах это противоречит цели. Мы не создаем приложения MVC, чтобы иметь хорошую структуру, но также и чтобы лучше выполнять модульное тестирование.

Возвращаясь к вашему вопросу, как все это связано с 3-уровневой архитектурой ASP.NET.
Можно сказать, что в основном все веб-приложение MVC - это не что иное, как уровень презентации (+ подключение уровня презентации к слою Busines).

Другие уровни остаются отдельными и независимыми от уровня представления, как и прежде.

4 голосов
/ 17 марта 2012

MVC и 3-х уровневые совершенно разные вещи.Я вижу, что многие люди путают эти два, потому что оба получили 3 части.

MVC - это шаблон пользовательского интерфейса : Просмотр : содержит только html и js (в случае веб-проекта) Контроллер : это своего рода посредник между пользовательским интерфейсом (= представление) и серверной частью (= модель) Модель : здесь находятся ваши доменные объекты, а также логика бизнеса и доступа к данным

3-уровневая касается целых из вас заявка : UI : содержит html / js, а также код позади страниц.Здесь абсолютно нет логики , кроме кода пользовательского интерфейса и вызова бизнес-уровня. Бизнес-уровень : здесь вы размещаете такие вещи, как вычисления, условия, проверка, ..Итак, реальное поведение вашего приложения.Здесь нет кода доступа к данным кода. Доступ к данным : здесь, где вы общаетесь с базой данных и возвращаете данные на бизнес-уровень. Ничего другого , бизнес-уровень должен знать, что с ним делать.

Так что, если вы объедините два , вы получите:Пользовательский интерфейс: представления и контроллерыБизнес-уровень: часть моделиДоступ к данным: часть моделиДоменный объект: вы хотите поместить объекты, с которыми вы работаете (product, order, ..), в отдельный слой.Это тоже часть модели.

Снимайте, если у вас есть вопросы!

0 голосов
/ 17 марта 2012

См. здесь для хорошего сравнения между "слоями" и "уровнями" в архитектуре / дизайне программного обеспечения

Шаблон MVC полностью связан с разделением интересов и тем фактом, что ваш уровень представления (представление) и бизнес-логика должны быть разделены. Использование кода позволяет легко мутить воду. Вы обнаружите, что новый движок представления ASP.NET (Razor) даже не имеет кода за файлами.

Основное различие, которое начнет иметь большее значение, когда вы захотите автоматически проверить логику в вашем контроллере, состоит в том, что контроллер - это просто старый класс, но ваш код наследуется от System.Web.UI.Page и, таким образом, сильно привязан к внутренностям ASP.net.

Также прочитайте http://ardalis.com/Codebehind-Files-in-ASP.NET-MVC-are-Evil а также https://msmvps.com/blogs/luisabreu/archive/2008/09/19/codebehind-files-in-asp-net-mvc-are-not-evil.aspx

...