3层架构 - 需要一个例子

Sur*_*har 13 architecture asp.net

目前我正在使用单层架构.现在我想学习如何使用3层架构编写代码.请问您能给我一个简单的例子吗?

Rub*_*ias 22

维基百科有一个很好的解释:多层架构:

"三层"是一种客户端 - 服务器架构,其中用户界面,功能处理逻辑("业务规则"),计算机数据存储和数据访问是作为独立模块开发和维护的,通常在不同的平台上.

替代文字

Web开发用法

在Web开发领域,三层通常用于指代使用三层构建的网站,通常是电子商务网站:

  • 提供静态内容的前端Web服务器,可能还有一些缓存的动态内容.
  • 中间动态内容处理和生成级应用服务器,例如Java EE,ASP.net,PHP平台.
  • 后端数据库,包括数据集和数据库管理系统或管理和提供数据访问的RDBMS软件.


thi*_*eek 15

这就是我项目中的内容.不仅仅是传统的3层架构.

1.)Application.Infrastructure

  • 所有业务对象的基类,业务对象集合,数据访问类以及我的自定义属性和实用程序作为扩展方法,通用验证框架.这决定了我最终的.net应用程序的整体行为组织.

2.)Application.DataModel

  • 数据库的类型化数据集.
  • TableAdapters扩展为包含我可能需要的事务和其他功能.

3.)Application.DataAccess

  • 数据访问类.
  • 使用基础类型化数据集查询数据库操作的实际位置.

4.)Application.DomainObjects

  • 业务对象和业务对象集合.
  • 枚举.

5.)Application.BusinessLayer

  • 提供可从Presentation层访问的管理器类.
  • HttpHandlers的.
  • 我自己的Page基类.
  • 更多的事情去这里..

6.)Application.WebClientApplication.WindowsClient

  • 我的表示层
  • 从Application.BusinessLayer和Application.BusinessObjects获取引用.

Application.BusinessObjects在整个应用程序中使用,并且每当需要时它们都会遍历所有层[Application.DataModel和Application.Infrastructure除外]

我的所有查询都只定义了Application.DataModel.

Application.DataAccess返回或接受Business对象作为任何数据访问操作的一部分.业务对象是在反射属性的帮助下创建的.每个业务对象都标记有一个属性映射到数据库中的目标表,业务对象中的属性使用映射到相应数据库表中的目标列的属性进行标记.

我的验证框架允许我在指定的ValidationAttribute的帮助下验证每个字段.

我的framrwork大量使用Attributes来自动化大多数繁琐的任务,如映射和验证.我还可以将新功能作为框架中的新方面.

在我的应用程序中,示例业务对象将如下所示.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)


Cra*_*rze 10

"层"是指软件堆栈中的"层"?"层"一词更适用于描述系统的物理组件.如果您使用的是ASP.NET,那么您可能已经拥有了"3层"系统 -

  1. 浏览器显示网页
  2. IIS服务器托管您的应用程序
  3. 数据库服务器与您的数据库

但是您可能将所有代码放入单个软件"层" - 特别是aspx页面的代码隐藏文件.您想要从单层移动到3层方法.经典的"3层"软件架构包括以下内容 -

  1. 表达层

  2. 业务逻辑层(BLL)

  3. 数据访问层(DAL)

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

对于典型的ASP.NET应用程序,您可以按如下方式应用它.首先,创建一个包含数据库访问对象的LINQ2SQL文件(.dbml).这是您的数据访问层(DAL).

接下来,您可以创建一个DLL来包含业务逻辑层(BLL).该层将通过DAL访问数据库,根据需要对其进行操作,然后通过简单的界面将其公开.例如,如果您的应用程序显示客户端列表,则您的BLL可能具有名为GetClientList()的公共函数,该函数返回客户端列​​表.

最后,您将在文件后面设置代码以实例化BLL并将其连接到接口组件.这是您的表示层.例如,它可能需要从GetClientList()函数返回的数据并将其绑定到Web表单上的数据网格.我们的想法是让表示层尽可能地薄.

这似乎有点啰嗦,但是一旦你做了几次就很直接.您会发现将这样的应用程序分离出来会使维护更加容易,因为关注点分离会导致代码更清晰.您还会发现升级甚至更换表示层要容易得多,因为它包含非常少的智能.最后,您将获得一些可以在新应用程序中轻松使用的非常有用的BLL库,从而大大提高了工作效率.


Vic*_*aci 5

表示层:放置与用户界面相关的所有内容。(用户看到的)

业务层:与应用逻辑相关的一切(来自表现层的信息如何处理)

数据层:提供底层数据源的抽象(来自/去往业务层的信息在哪里以及如何存储)

每一层都应该尽可能少地了解另一层,它应该是一种自上而下的方法:

  • 数据层应该对业务和表示一无所知
  • 业务层应该知道数据而不是表示
  • 演示应该了解业务而不是数据

简单的例子:

网站:

  • 展示:所有图形化的东西,用户插入数据的字段,菜单,图片等。
  • 业务:关于数据的所有约束(唯一名称、无符号名称、有效日期等)、操作业务对象的方法(创建新用户、添加新订单等)
  • 数据:访问底层数据库的方法。


sle*_*ske 5

三层架构可以根据上下文具有不同的含义。通常这意味着应用程序中的职责在不同的层之间划分。通常,3 层是指:

  • 表示层”(实际用户界面)
  • 逻辑层(应用/业务逻辑)
  • 数据层(数据库、数据存储)

详细信息因应用程序而异。

像往常一样,维基百科有一个很好的概述:http : //en.wikipedia.org/wiki/Multitier_architecture

一个简单的例子是一个典型的商业应用程序:

  • 演示:浏览器或胖客户端
  • 逻辑层:业务逻辑,通常在应用服务器中(基于 J2EE、ASP.NET 或其他)
  • 数据层:一个数据库,通常是一个 RDBMS,如 MySQL 或 Oracle