佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1587|回复: 15

怎么才算是真正的三层架构?

[复制链接]
发表于 12-3-2013 02:21 PM | 显示全部楼层 |阅读模式
三层架构 (3 Tier Architecture Layer)

我在做我的Final Year Project。
我是用Visual STudio 2010 Ultimate, MS SQL,C#来写。

学校的老师说要用三层架构。

上网找了很多资料,我还是有点明白怎样才算是真正的三层架构。

据我所了解的三层架构是以下这样:

Presentation Layer reference Business Logic Layer
Business Logic Layer reference Data Access Layer

Presentation Layer -> Business Logic Layer -> Data Access Layer

不可以这样:
Presentation Layer -> Business Logic Layer <- Data Access Layer
也不可以这样,因为会形成Circular Dependecy。
Presentation Layer -> Business Logic Layer <-> Data Access Layer

我看了很多的coding,有点不解以下的coding算是不是Presentation Layer -> Business Logic Layer -> Data Access Layer 还是 Presentation Layer -> Business Logic Layer <-> Data Access Layer

Business Logic Layer (product.cs)
using System;
using System.Collections.Generic;
using DataAccessLayer;

namespace BusinessLogicLayer
{
   public class product
   {
      private int _id;
      private string _name;
      private string _description;

      public int Id
      {
          get { return _id; }
          set { _id = value; }
      }

     public string Name
     {
         get { return _name; }
         set { _name = value; }
     }

     public string Description
     {
         get { return _description; }
         set { _description = value; }
     }


     public static void Insert(string name, string description)
     {
        Product newProduct = new Product (name, description)
        newProduct.Save();
     }

     public static void Save()
     {
         if (String.IsNullOrEmpty(_name))
             throw new ArgumentException("Product Name not supplied", "name");

          SqlDataAccessLayer dataAccessLayer = new SqlDataAccessLayer();
          dataAccessLayer.ProductInsert(this);
     }
   }
}

Data Access Layer (SqlDataAccessLayer.cs)
using System;
using System.Data;
using System.Data.SqlClient;
using System.WebConfiguration;
using System.Collections.Generic;
using BusinessLogicLayer;因为那个Product newProduct,所以要refernce回去BusinessLogicLayer。这样会形成Circular Dependecy。会有Error。

namespace DataAccessLayer
{
    public class SqlDataAccessLayer
   {
       private static readonly string _connectionString = string.Empty;

       public void ProductInsert(Product newProduct) 这个不就是要用到Product.CS。那么就是reference去BusinesLogicLayer?这样还算是3 tier architecture layer??
       {
           SqlConnection con = new SqlConnection(_connectionString);

           SqlCommand cmd = new SqlCommand();
           cmd.Connection = con;
           cmd.CommandText = "Insert Products (Name, Description) Values (@Name, @Description)";

           cmd.Parameters.AddWithValue("@Name", newProduct.Name);
           cmd.Parameters.AddWithValue("@Description", newProduct.Description);

           using (con)
           {
               con.Open();
               cmd.ExecuteNonQuery();
           }
        }
    }
}


请各位大大/高手指点迷津。或帮我修改这个coding,让我知道怎么做。

回复

使用道具 举报


ADVERTISEMENT

发表于 12-3-2013 02:48 PM | 显示全部楼层
把business logic从Product class抽出来, 所以Product变成1个单纯的value object, 只是收properties而已。
那你的dao就没错了。
加多1个class来负责business logic

评分

参与人数 1人气 +5 收起 理由
快乐鸭子 + 5 谢谢指点。

查看全部评分

回复

使用道具 举报

 楼主| 发表于 12-3-2013 03:08 PM | 显示全部楼层
nsda 发表于 12-3-2013 02:48 PM
把business logic从Product class抽出来, 所以Product变成1个单纯的value object, 只是收properties而已。 ...

谢谢你的回复。

如果我把它抽出来,它是被放在另外一个Layer,对吗?那个Layer应该叫什么名字?是否应该叫Property Layer呢?

我的Business Logic Layer和Data Access Layer就refer去这个新的Layer?

还有,Product里面还可以有以下的coding吗?(之前那个coding没有写出来)

public Product(int id, string name, string description)
{
    _id = id;
    _name = name;
    _description = description;
}

public Product(string name, string description) : this(0, name, description) { } 其实这个东西,我不知道什么用处。我是照一本ebook里的。



回复

使用道具 举报

发表于 12-3-2013 03:59 PM | 显示全部楼层
快乐鸭子 发表于 12-3-2013 03:08 PM
谢谢你的回复。

如果我把它抽出来,它是被放在另外一个Layer,对吗?那个Layer应该叫什么名字?是否应 ...

喜欢叫object, valueobject, entity也可以...算是1个pure property的东西, 全部project里面的layer都可以access的。

下面这个constructor可有可无, 有需要用到就留着, 方便你create a new instance.
  1. public Product(int id, string name, string description)
  2. {
  3.     _id = id;
  4.     _name = name;
  5.     _description = description;
  6. }
复制代码
下面这种写法我没看过...应该是.net专有的吧? 我不会.net的。 但是看起来像是第2个constructor, 当你用下面这个constructor时, 会把id default 成0, 然后再call上面的constructor。 应该是这样瓜...没需要的话也可以拿掉
  1. public Product(string name, string description) : this(0, name, description) { }
复制代码

评分

参与人数 1人气 +5 收起 理由
快乐鸭子 + 5 再次谢谢你。

查看全部评分

回复

使用道具 举报

 楼主| 发表于 12-3-2013 05:27 PM | 显示全部楼层
nsda 发表于 12-3-2013 03:59 PM
喜欢叫object, valueobject, entity也可以...算是1个pure property的东西, 全部project里面的layer都可以 ...

不知道我哪里做错了还是少做了一些东西。

Database里面就是没有add到Data。
回复

使用道具 举报

发表于 12-3-2013 06:05 PM | 显示全部楼层
快乐鸭子 发表于 12-3-2013 05:27 PM
不知道我哪里做错了还是少做了一些东西。

Database里面就是没有add到Data。

check看有没有error, 没有error的话, visual studio那里, 不懂叫datasource还是data adapter还是什么的, 是不是有一个setting可以turn on好让你的data可以直接commit的, 读书时候中过这问题, 忘记叫什么了

google search看看吧, 应该很多人遇过一样的问题
回复

使用道具 举报

Follow Us
 楼主| 发表于 12-3-2013 07:30 PM | 显示全部楼层
nsda 发表于 12-3-2013 06:05 PM
check看有没有error, 没有error的话, visual studio那里, 不懂叫datasource还是data adapter还是什么的 ...

终于可以了。Stored Procedure也可以了。

谢谢你的指点。

评分

参与人数 1人气 +1 收起 理由
nsda + 1 有帮到就好, 不客气

查看全部评分

回复

使用道具 举报

发表于 3-4-2013 08:58 PM | 显示全部楼层
路过看一看。。。。哈哈。。。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 6-4-2013 01:34 PM | 显示全部楼层
prolife 发表于 3-4-2013 08:58 PM
路过看一看。。。。哈哈。。。

大家一起来讨论。。
回复

使用道具 举报

 楼主| 发表于 6-4-2013 01:41 PM | 显示全部楼层
这个project搞到我蛮累的。
当我知道对的3tier architecture时候,已经来不及去改。
就用错的3 tier architecture。
回复

使用道具 举报

发表于 7-4-2013 10:44 AM | 显示全部楼层
快乐鸭子 发表于 6-4-2013 01:41 PM
这个project搞到我蛮累的。
当我知道对的3tier architecture时候,已经来不及去改。
就用错的3 tier arch ...

3 tier archtecture 的最明显例子就是 MVC framework
回复

使用道具 举报

发表于 7-4-2013 09:58 PM | 显示全部楼层
Presentation Layer  -> gui
Business Logic Layer  -> entity

Presentation Layer -> database

请纠正我。。。
回复

使用道具 举报

发表于 7-4-2013 11:02 PM | 显示全部楼层
我还以为 3 Tier Architecture Layer 是类似 SOA (Service Oriented Architecture)...
回复

使用道具 举报

发表于 9-4-2013 12:33 AM | 显示全部楼层
简单说就是

Presentation Layer
可以想成一些 function 或者 class

通过 Business Logic Layer 处理资料,包括读写搜寻等等

而 Business Logic Layer 除了处理、控制流程、次序,
还需要跟 Data Access Layer 拿资料

Data Access Layer 就根据 Business Layer 需要的资料,
做最内部的 如 select, insert, update, delete


随便写的,不对请尽量批评。

这里设定 Business Logic Layer 还包括处理权限 或者 其他限制、控制部分。

例如:
  1. // Presentation Layer
  2. function DisplayPersonalInfo( id ) {
  3.         personalInfo p = new personalInfo( id );

  4.         display p.name;
  5.         display p.address;
  6.         display p.contact;
  7. }



  8. // Business Logic Layer

  9. struct personalInfo {
  10.         string name, address, contact;
  11. };

  12. function personalInfo( id ) {

  13.         // check some logic, e.g. access rights

  14.         personalInfo p;
  15.         GetPersonalInfo( id, &p );
  16. }


  17. // Data Access Layer
  18. function GetPersonalInfo( id, p ) {

  19.         sql = "select * form staff where ID='" + id "';";

  20.         row = query ( sql );

  21.         p.name = row[0];
  22.         p.address = row[1];
  23.         p.contact = row[2];
  24. }

复制代码
回复

使用道具 举报

发表于 9-4-2013 12:59 AM | 显示全部楼层
doktorkoo 发表于 7-4-2013 10:44 AM
3 tier archtecture 的最明显例子就是 MVC framework

MVC 是 design pattern 而已,不是 Architecture,他们是有分别的。
他们的关系如下

3 tier - UI <-> BLL <-> DAL

MVC - View <-> Model <-> Controller <-> View

回复

使用道具 举报

发表于 9-4-2013 01:02 AM | 显示全部楼层
doktorkoo 发表于 7-4-2013 10:44 AM
3 tier archtecture 的最明显例子就是 MVC framework




回复

使用道具 举报


ADVERTISEMENT

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT


本周最热论坛帖子本周最热论坛帖子

ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 28-9-2025 02:38 PM , Processed in 0.134282 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表