Подтвердить что ты не робот

3 Архитектура уровня - нужен пример

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

4b9b3361

Ответ 1

Это то, что у меня есть в моем проекте. Больше, чем просто традиционная трехуровневая архитектура.

1.) Application.Infrastructure

  • Базовые классы для всех бизнес-объектов, бизнес-коллекции объектов, классов доступа к данным и моих пользовательских атрибутов и утилит в качестве методов расширения. Это определяет общую организацию поведения моего последнего приложения .net.

2.) Application.DataModel

  • Типизированный набор данных для базы данных.
  • TableAdapters расширены для включения транзакций и других функций, которые могут мне понадобиться.

3.) Application.DataAccess

  • Классы доступа к данным.
  • Фактическое место, в котором запрашиваются действия с базой данных, используя базовый набор типизированных данных.

4.) Application.DomainObjects

  • Бизнес-объекты и коллекции бизнес-объектов.
  • Перечисления.

5.) Application.BusinessLayer

  • Предоставляет классы менеджера, доступные из уровня представления.
  • HttpHandlers.
  • Мой собственный базовый класс страницы.
  • Больше вещей здесь.

6.) Application.WebClient или Application.WindowsClient

  • Мой уровень представления
  • Принимает ссылки на Application.BusinessLayer и Application.BusinessObjects.

Application.BusinessObjects используются во всем приложении, и они перемещаются по всем слоям всякий раз, когда neeeded [кроме Application.DataModel и Application.Infrastructure]

Все мои запросы определяются только Application.DataModel.

Application.DataAccess возвращает или принимает бизнес-объекты как часть любой операции доступа к данным. Бизнес-объекты создаются с помощью атрибутов отражения. Каждый бизнес-объект помечен сопоставлением атрибутов в целевой таблице в базе данных, а свойства в бизнес-объекте помечены сопоставлением атрибутов целевому coloumn в соответствующей таблице базы данных.

Моя структура проверки позволяет мне проверять каждое поле с помощью назначенного ValidationAttribute.

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

Образец бизнес-объекта будет выглядеть так в моем приложении.

User.cs

[TableMapping("Users")]
public class User : EntityBase
{
    #region Constructor(s)
    public AppUser()
    {
        BookCollection = new BookCollection();
    }
    #endregion

    #region Properties

    #region Default Properties - Direct Field Mapping using DataFieldMappingAttribute

    private System.Int32 _UserId;

    private System.String _FirstName;
    private System.String _LastName;
    private System.String _UserName;
    private System.Boolean _IsActive;

    [DataFieldMapping("UserID")]
    [DataObjectFieldAttribute(true, true, false)]
    [NotNullOrEmpty(Message = "UserID From Users Table Is Required.")]
    public override int Id
    {
        get
        {
            return _UserId;
        }
        set
        {
            _UserId = value;
        }
    }

    [DataFieldMapping("UserName")]
    [Searchable]
    [NotNullOrEmpty(Message = "Username Is Required.")]
    public string UserName
    {
        get
        {
            return _UserName;
        }
        set
        {
            _UserName = value;
        }
    }

    [DataFieldMapping("FirstName")]
    [Searchable]
    public string FirstName
    {
        get
        {
            return _FirstName;
        }
        set
        {
            _FirstName = value;
        }
    }

    [DataFieldMapping("LastName")]
    [Searchable]
    public string LastName
    {
        get
        {
            return _LastName;
        }
        set
        {
            _LastName = value;
        }
    }

    [DataFieldMapping("IsActive")]
    public bool IsActive
    {
        get
        {
            return _IsActive;
        }
        set
        {
            _IsActive = value;
        }
    }

    #region One-To-Many Mappings
    public BookCollection Books { get; set; }

    #endregion

    #region Derived Properties
    public string FullName { get { return this.FirstName + " " + this.LastName; } }

    #endregion

    #endregion

    public override bool Validate()
    {
        bool baseValid = base.Validate();
        bool localValid = Books.Validate();
        return baseValid && localValid;
    }
}

BookCollection.cs

/// <summary>
/// The BookCollection class is designed to work with lists of instances of Book.
/// </summary>
public class BookCollection : EntityCollectionBase<Book>
{
    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection()
    {
    }

    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection (IList<Book> initialList)
        : base(initialList)
    {
    }
}

Ответ 2

В Википедии есть приятное объяснение: Многоуровневая архитектура:

"Трехуровневая" - это архитектура клиент-сервер, в которой пользовательский интерфейс, логика функциональных процессов ( "бизнес-правила" ), хранение компьютерных данных и доступ к данным разрабатываются и поддерживаются как независимые модули, чаще всего на отдельных платформах.

alt text

Использование веб-разработки

В области веб-разработки три уровня часто используются для ссылок на веб-сайты, обычно сайты электронной коммерции, которые построены с использованием трех уровней:

  •   
  • Веб-сервер с внешним интерфейсом, обслуживающий статический контент, и потенциально кешированный динамический контент.  
  • Сервер приложений среднего уровня для обработки контента и уровня генерации, например платформа Java EE, ASP.net, PHP.  
  • Базовая база данных, включающая как наборы данных, так и систему управления базами данных или программное обеспечение RDBMS, которое управляет и обеспечивает доступ к данным.  

Ответ 3

Под "уровнем" вы подразумеваете "уровень" в вашем стеке программ? Слово "уровень" лучше использовать для описания физических компонентов вашей системы. Если вы используете ASP.NET, у вас, вероятно, уже есть "трехуровневая" система -

  • Браузер, отображающий веб-страницы.
  • Сервер IIS, поддерживающий ваше приложение
  • Сервер базы данных с вашей базой данных

Но вы, возможно, помещаете весь свой код в один "слой" программного обеспечения - в частности, код за файлом ваших страниц aspx. Вы хотите перейти от одного слоя к трехслойному подходу. Классическая программная архитектура "3 слоя" состоит из следующих элементов:

  • Уровень презентации

  • Бизнес-логический уровень (BLL)

  • Уровень доступа к данным (DAL)

alt text http://weblogs.asp.net/blogs/fredriknormen/WindowsLiveWriter/UsingWebServicesina3tierarchitecture_134F6/3tier_2.jpg

Для типичного приложения ASP.NET вы можете применить это следующим образом. Во-первых, вы создаете файл LINQ2SQL (.dbml), содержащий объекты для доступа к базе данных. Это ваш уровень доступа к данным (DAL).

Затем вы можете создать DLL, чтобы содержать Business Logic Layer (BLL). Этот уровень будет обращаться к базе данных через DAL, манипулировать ею по мере необходимости, а затем выставлять ее через простой интерфейс. Например, если ваше приложение отображает список клиентов, ваш BLL может иметь открытую функцию GetClientList(), которая возвращает список клиентов.

Наконец, вы создадите свой код за файлами, чтобы создать экземпляр BLL и подключить его к компонентам интерфейса. Это ваш уровень презентации. Например, он может принимать данные, возвращаемые из функции GetClientList(), и привязывать их к сетке данных в веб-форме. Идея состоит в том, чтобы слой презентации был как можно более тонким.

Это кажется немного длинным, чтобы описать, но это довольно прямолинейно, как только вы это сделали пару раз. Вы обнаружите, что разделение вашего приложения, как это, упростит его работу, поскольку разделение проблем приведет к созданию более чистого кода. Вам также будет намного проще обновить или даже заменить слой презентации, поскольку он содержит очень мало умений. Наконец, вы доберетесь до точки, в которой у вас есть множество очень полезных библиотек BLL, которые вы легко можете использовать в новых приложениях, что значительно повышает производительность.

Ответ 4

Уровень презентации: поместите все, что связано с пользовательским интерфейсом. (Что видит пользователь)

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

Уровень данных: предоставить абстракцию базового источника (ов) данных (где и как хранится информация, поступающая с/на бизнес-уровень)

Каждый слой должен знать как можно меньше о другом, и он должен быть сверху вниз:

  • уровень данных не должен знать ничего о бизнесе и презентации
  • бизнес-уровень должен знать о данных, но не о представлении
  • презентация должна знать о бизнесе, но не о данных

Простой пример:

Веб-сайт:

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

Ответ 5

3-уровневая архитектура может иметь разные значения в зависимости от контекста. Как правило, это означает, что обязанности в приложении распределяются между разными уровнями. Как правило, 3-ярус относится к:

  • уровень представления "(фактический пользовательский интерфейс)
  • логический уровень (прикладная/бизнес-логика)
  • уровень данных (база данных, хранилище данных)

Информация зависит от приложения.

Википедия, как обычно, имеет приятный обзор: http://en.wikipedia.org/wiki/Multitier_architecture

Простым примером может служить типичное бизнес-приложение:

  • презентация: браузер или толстый клиент
  • логический уровень: бизнес-логика, как правило, на сервере приложений (на основе J2EE, ASP.NET или что-то еще)
  • уровень данных: база данных, как правило, СУБД, такая как MySQL или Oracle

Ответ 6

Архитектура с тремя уровнями обычно имеет следующие компоненты:

  • Браузер клиентов
  • Веб-сервер, на котором размещено приложение ASP.NET
  • Некоторое бэкэнд-хранилище, такое как база данных, к которому обращается приложение ASP.NET

Итак, чтобы ответить на вопрос о том, как писать код для трехуровневой архитектуры, вы разрабатываете приложение ASP.NET, которое общается с хранилищем данных.

Ответ 7

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

http://nerddinnerbook.s3.amazonaws.com/Intro.htm

Это не учебник по многоуровневой архитектуре, но это хорошо написанное приложение и дает некоторое представление о том, почему вы можете рассмотреть эту архитектуру.

Кроме того, как это было вкратце затронуто выше, речь идет о том, чтобы разделить ваш логический/запоминающий/презентационный код, поэтому, если вам нужно изменить один из них (например, перейти от front-in-asp.net к настольному приложению), это не так сложно сделать.

Ответ 8

Трехуровневый уровень - это архитектура клиент-сервер, в которой пользовательский интерфейс, бизнес-процесс (бизнес-правила), а также хранение данных и доступ к данным разрабатываются и поддерживаются как независимые модули или чаще всего на отдельных платформах.

В принципе, есть 3 слоя:

  • уровень 1 (уровень представления, уровень GUI)
  • уровень 2 (бизнес-объекты, уровень бизнес-логики)
  • уровень 3 (уровень доступа к данным). Эти уровни могут разрабатываться и тестироваться отдельно.

В чем заключается необходимость деления кода на 3 уровня? Разделение пользовательского интерфейса от бизнес-логики и доступа к базе данных имеет много преимуществ. Некоторые из преимуществ заключаются в следующем:

Повторяемость компонента бизнес-логики приводит к быстрому развитие. Скажем, у нас есть модуль, который обрабатывает добавление, обновление, удаление и поиск клиентов в системе. Поскольку этот компонент разработанные и протестированные, мы можем использовать его в любом другом проекте, который мог бы привлекать клиентов.

Трансформация системы проста. Поскольку бизнес-логика отдельно от уровня доступа к данным, изменение уровня доступа к данным не будут сильно влиять на бизнес-логику. Скажем, если мы переход от хранилища данных SQL Server к Oracle там не должен быть изменения, необходимые для компонента бизнес-уровня и в графическом интерфейсе компонент.

Управление изменениями в системе очень просто. Скажем, если есть несовершеннолетний изменения в бизнес-логике, нам не нужно устанавливать все системы на персональных компьютерах пользователей. Например. если GST (TAX) изменен с 10% до 15% нам нужно только обновить компонент бизнес-логики без влияя на пользователей и без простоя.

Наличие отдельных серверов функциональности позволяет осуществлять параллельную разработку отдельных уровней специалистами-специалистами.

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

Ответ 9

connection class
-----------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web .UI.WebControls ;
/// <summary>
/// Summary description for conn
/// </summary>
namespace apm_conn
{
    public class conn
    {
        public SqlConnection getcon()
        {
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["connect"].ConnectionString );
            if (con.State == ConnectionState.Closed)
            {
                con.Open();
            }
            return con;
        }
        #region execute command
        public string  Executecommand(SqlParameter []sqlparm,string sp)
        {
            string r_val = "";
            try
            {

                SqlConnection con = new SqlConnection();
                con = getcon();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.CommandText = sp;
                cmd.CommandType = CommandType.StoredProcedure;
                foreach (SqlParameter loopvar_parm in sqlparm)
                {
                    cmd.Parameters.Add(loopvar_parm);

                }
                cmd.Parameters.Add("@Var_Output", SqlDbType.VarChar, 20).Direction = ParameterDirection.Output;
                cmd.ExecuteNonQuery();
                r_val = (string)cmd.Parameters["@Var_Output"].Value;
                con.Close();
            }
            catch { }
            return r_val;

        }

        #endregion
        #region Execute Dataset
         public DataSet ExeccuteDataset(SqlParameter[] sqlParm, string sp)
    {
        DataSet ds = new DataSet();
        try
        {
            SqlConnection con = new SqlConnection();
            con = getConn();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = sp;
            foreach (SqlParameter LoopVar_param in sqlParm)
            {
                cmd.Parameters.Add(LoopVar_param);
            }
            cmd.ExecuteNonQuery();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(ds);

        }
        catch
        { }
        return ds;
    }
        #endregion
        #region grid
        public void Bindgrid(DataSet ds,GridView g)
        {
            try
            {
                g.DataSource = ds.Tables[0];
                g.DataBind();

            }
            catch { }
        }
        #endregion
        #region Dropdownlist
        public void Binddropdown(DropDownList dl,DataSet ds,string text,string value)
        {
            try
            {
                dl.DataSource = ds.Tables[0];
                dl.DataTextField = text;
                dl.DataValueField = value;
                dl.DataBind();
            }
            catch
            {}

        }
        #endregion
        public conn()
        {
            //
            // TODO: Add constructor logic here
            //
        }
    }
}




dal
---------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using apm_conn;
using System.Data.SqlClient;
using apm_ent;

/// <summary>
/// Summary description for Class1
/// </summary>
namespace apm_dal
{
    public class dal
    {
        conn ob_conn = new conn();
        public dal()
        {
            //
            // TODO: Add constructor logic here
            //
        }
        public string insert(ent obj_ent)
        {
            SqlParameter[] sqlparm =
        {
            new SqlParameter ("@Var_Action",obj_ent.Var_Action),
            new SqlParameter ("@Int_Id",obj_ent.Int_Id ),
             new SqlParameter ("@Var_Product",obj_ent.Var_Product ),
              new SqlParameter ("@Dc_Price",obj_ent.Var_Price ),
              new SqlParameter ("@Int_Stat",obj_ent.Int_Stat ),

                               };
            return ob_conn.Executecommand(sqlparm, "Proc_product");
        }
        public string ins(ent obj_ent)
        {
            SqlParameter[] parm =
        {
            new SqlParameter ("@Var_Action",obj_ent .Var_Action),
            new SqlParameter ("@Int_Id",obj_ent .Int_Id),
                            };
            return ob_conn.Executecommand(parm, "Proc_product");
        }
    }

}

bal
-------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using apm_ent;
using apm_dal;

/// <summary>
/// Summary description for bal
/// </summary>
namespace apm_Bal
{

    public class bal
    {
        dal ob_dal = new dal();
        string r_val = "";
        public bal()
        {
            //
            // TODO: Add constructor logic here
            //
        }
        public string insert(ent obj_ent)
        {
            return ob_dal.insert(obj_ent);
        }
    }
}



Ent
------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for ent
/// </summary>
namespace apm_ent
{
    public class ent
    {
        public ent()
        {
            //
            // TODO: Add constructor logic here
            //
        }
        #region Ent
        public int Int_Id { get; set; }
        public string  Var_Action { get; set; }
        public string Var_Product { get; set; }
        public decimal  Var_Price { get; set; }
        public int Int_Stat { get; set; }
        #endregion
    }
}



page code
--------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using apm_conn;
using apm_ent;
using apm_Bal;
using apm_conn;
public partial class _Default : System.Web.UI.Page
{
    conn obj_conn = new conn();
    ent obj_ent = new ent();
    bal obj_bal = new bal();
    string r_val = "";
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void btnsub_Click(object sender, EventArgs e)
    {
        obj_ent.Var_Action = "INS";
        obj_ent.Var_Product = txtproduct.Text;
        obj_ent.Var_Price = Convert.ToDecimal (txtprice.Text);
        r_val = obj_bal.insert(obj_ent);
        if (r_val == "1")
        {
            Response.Write("<script>alert('Inserted Sucessfully')</script>");
        }
    }
}