查看: 1587|回复: 15
|
怎么才算是真正的三层架构?
[复制链接]
|
|
三层架构 (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,让我知道怎么做。
|
|
|
|
|
|
|
|
发表于 12-3-2013 02:48 PM
|
显示全部楼层
把business logic从Product class抽出来, 所以Product变成1个单纯的value object, 只是收properties而已。
那你的dao就没错了。
加多1个class来负责business logic |
评分
-
查看全部评分
|
|
|
|
|
|
|

楼主 |
发表于 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.- public Product(int id, string name, string description)
- {
- _id = id;
- _name = name;
- _description = description;
- }
复制代码 下面这种写法我没看过...应该是.net专有的吧? 我不会.net的。 但是看起来像是第2个constructor, 当你用下面这个constructor时, 会把id default 成0, 然后再call上面的constructor。 应该是这样瓜...没需要的话也可以拿掉- public Product(string name, string description) : this(0, name, description) { }
复制代码 |
评分
-
查看全部评分
|
|
|
|
|
|
|

楼主 |
发表于 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看看吧, 应该很多人遇过一样的问题
|
|
|
|
|
|
|
|

楼主 |
发表于 12-3-2013 07:30 PM
|
显示全部楼层
nsda 发表于 12-3-2013 06:05 PM 
check看有没有error, 没有error的话, visual studio那里, 不懂叫datasource还是data adapter还是什么的 ...
终于可以了。Stored Procedure也可以了。
谢谢你的指点。
|
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 3-4-2013 08:58 PM
|
显示全部楼层
路过看一看。。。。哈哈。。。 |
|
|
|
|
|
|
|

楼主 |
发表于 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 还包括处理权限 或者 其他限制、控制部分。
例如:- // Presentation Layer
- function DisplayPersonalInfo( id ) {
- personalInfo p = new personalInfo( id );
- display p.name;
- display p.address;
- display p.contact;
- }
- // Business Logic Layer
- struct personalInfo {
- string name, address, contact;
- };
- function personalInfo( id ) {
- // check some logic, e.g. access rights
- personalInfo p;
- GetPersonalInfo( id, &p );
- }
- // Data Access Layer
- function GetPersonalInfo( id, p ) {
- sql = "select * form staff where ID='" + id "';";
- row = query ( sql );
- p.name = row[0];
- p.address = row[1];
- p.contact = row[2];
- }
复制代码 |
|
|
|
|
|
|
|
发表于 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
|
显示全部楼层
|
|
|
|
|
|
| |
本周最热论坛帖子
|