C# C/S版的三层架构如何建立?

mansheng 2010-06-04 03:04:19
最近做个餐厅管理系统,但是要求做成三层架构的,以前做的Winform版不是三层的,要有个服务器端Server,一个客户端ClientUI层,一个DAL数据处理层,一个BLL逻辑层,一个Model实体层,该怎么做呢?逻辑层跟实体层到底是怎么做的,是放什么东西进去的呢?逻辑层能用一些像DataSet,DataTable等装载数据类型的东西吗?还有实体层是不是全部都是对应的数据库表的字段的封装呀?get{};set{};方法。小弟在此先感谢大家?
...全文
3604 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
EavesDoo 2011-11-03
  • 打赏
  • 举报
回复
我想了解这样三层如何实现
C/S
Client -- App Server -- DB
即多个Clinet都访问App Server ,App分配资源去访问DB,
防止每个Client对DB造成的负担过重



ohyeahh 2011-10-11
  • 打赏
  • 举报
回复
留个脚印
ujkk858 2011-07-21
  • 打赏
  • 举报
回复
其实我也有很多疑问,我做的项目应该就是三层构架,比如界面层,client.dll,数据层data.dll
data.dll可以放置在服务器,对数据库的操作都放置在data.dll里面..可是如果前台几十个界面程序,data.dll就一个,前台任意一个界面改动,data.dll都要更新,很麻烦而且更新还要用,更新如果要生效,还需要将服务端的服务停止掉,再重新启动..请问各位有没有什么好的构架思路解决这样的问题的..
mansheng 2010-06-08
  • 打赏
  • 举报
回复
谢谢大家的帮助
sniperhe 2010-06-06
  • 打赏
  • 举报
回复
我有个问题:dal只是最基本的操作,bll是业务逻辑,那么假如数据库有个字段是datetime的,我需要从数据库读取一个datetime > 现在 的一条记录,那应该把这个筛选交给bll吧?可是bll里面并不能操作sql语句啊,这里应该怎么处理。或者说我需要的sql语句需要用到not in这个语法,应该怎样写?这个问题,网上所谓的三层结构的描述都没有说到过,我相信很多人就卡在这里。。。
deknight 2010-06-06
  • 打赏
  • 举报
回复
来学习的,LS都是牛人
Wings_JK 2010-06-06
  • 打赏
  • 举报
回复
model就是数据库表的映射,DAL数据库字段提取的方法类,BLL对提取数据后进行的业务处理的方法类,推荐动软,挺好使的
xdick 2010-06-06
  • 打赏
  • 举报
回复
知道codesmith吗?直接用动软就来架好三层结构。
mansheng 2010-06-05
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 zxp8819 的回复:]
又是这些烂项目
用抽象工厂吧
[/Quote]
这位仁兄那请你能说下具体点的东西吗?给个东西我参考下把谢谢
铛铛 2010-06-05
  • 打赏
  • 举报
回复
又是这些烂项目
用抽象工厂吧
mansheng 2010-06-05
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 hejiasoft 的回复:]
前段时间刚做完一个餐饮客房管理系统,如果不用TCP/IP协议的话,直接用简单的三层,如果服务器端需要进行监听的话,可以在服务器端监视TCP/IP端口获取数据
[/Quote]
我现在就是要用到TCP/IP协议了,那我该怎么做呢??
xk1126 2010-06-05
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Text;
using RoomType.Model;
using RoomType.IDAL;
using System.Data;
using System.Data.SqlClient;

namespace RoomType.DAL.SQLServer
{
public class RoomTypeDAL:IRoomType
{
private static readonly string SELECT = "select TypeID,TypeName,TypePrice,AddBedPrice,IsAddBed,Remark from RoomType";

private static readonly string SELECT_NAME = SELECT + " where TypeName = @TypeName";

private static readonly string SELECT_LIKE_NAME = SELECT + " where TypeName like '%'+@TypeName+'%'";

private static readonly string UPDATE = "update RoomType set TypeName=@TypeName,TypePrice=@TypePrice,AddBedPrice=@AddBedPrice,IsAddBed=@IsAddBed,Remark=@Remark where TypeID = @TypeID";

private static readonly string DELETE = "delete from RoomType where TypeID = @TypeID";

private static readonly string INSERT = "insert into RoomType(TypeName,TypePrice,AddBedPrice,IsAddBed,Remark) values(@TypeName,@TypePrice,@AddBedPrice,@IsAddBed,@Remark)";


#region IRoomType 成员
//查询所有
public List<RoomTypes> SelectAll()
{
List<RoomTypes> roomTypess = new List<RoomTypes>();
SqlDataReader reader = DBHelper.ExecuteDataReader(SELECT,CommandType.Text);
FillRoomTypes(roomTypess, reader);
return roomTypess;
}

private static void FillRoomTypes(List<RoomTypes> roomTypess, SqlDataReader reader)
{
while (reader.Read())
{
RoomTypes room = new RoomTypes();
FillRoom(reader, room);
roomTypess.Add(room);
}
}

private static void FillRoom(SqlDataReader reader, RoomTypes room)
{
room.TypeID = reader.GetInt32(0);
room.TypeName = reader.GetString(1);
room.TypePrice = reader.GetDecimal(2);
room.AddBedPrice = reader.GetDecimal(3);
room.IsAddBed = reader.GetString(4);
room.Remark = reader[5] is DBNull ? string.Empty : reader.GetString(5);
}
//模糊查询
public List<RoomTypes> SelectByAll(string name)
{
List<RoomTypes> roomTypess = new List<RoomTypes>();
SqlParameter ps = new SqlParameter("@TypeName", name);
SqlDataReader reader = DBHelper.ExecuteDataReader(SELECT_LIKE_NAME, CommandType.Text,ps);
FillRoomTypes(roomTypess, reader);
return roomTypess;
}

public int Select(string name)
{
int i = 0;
SqlParameter ps = new SqlParameter("@TypeName", name);
SqlDataReader reader = DBHelper.ExecuteDataReader(SELECT_NAME,CommandType.Text,ps);
if (reader.Read())
{
i = reader.GetInt32(0);
}
return i;
}
//增加
public int Insert(RoomTypes roomType)
{
SqlParameter [] ps = new SqlParameter[5];
ps[0] = new SqlParameter("@TypeName",roomType.TypeName);
ps[1] = new SqlParameter("@TypePrice",roomType.TypePrice);
ps[2] = new SqlParameter("@AddBedPrice",roomType.AddBedPrice);
ps[3] = new SqlParameter("@IsAddBed",roomType.IsAddBed);
ps[4] = new SqlParameter("@Remark",roomType.Remark);
int i = DBHelper.ExecuteNonQuery(INSERT,CommandType.Text,ps);
return i;
}
//修改
public int Update(RoomTypes roomType)
{
SqlParameter[] ps = new SqlParameter[6];
ps[0] = new SqlParameter("@TypeName", roomType.TypeName);
ps[1] = new SqlParameter("@TypePrice", roomType.TypePrice);
ps[2] = new SqlParameter("@AddBedPrice", roomType.AddBedPrice);
ps[3] = new SqlParameter("@IsAddBed", roomType.IsAddBed);
ps[4] = new SqlParameter("@Remark", roomType.Remark);
ps[5] = new SqlParameter("@TypeID", roomType.TypeID);
int i = DBHelper.ExecuteNonQuery(UPDATE, CommandType.Text, ps);
return i;
}
//删除
public int Delete(RoomTypes roomType)
{
SqlParameter ps = new SqlParameter("@TypeID",roomType.TypeID);
int i = DBHelper.ExecuteNonQuery(DELETE,CommandType.Text,ps);
return i;
}

#endregion
}
}


数据访问层

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace RoomType.DAL.SQLServer
{
internal class DBHelper
{
private static readonly string connString=
ConfigurationManager.ConnectionStrings["HotelManageConnectionString"].ConnectionString;


public static DataSet ExecuteDataSet(string sql)
{
SqlDataAdapter sda = new SqlDataAdapter(sql,connString);
DataSet ds = new DataSet();
sda.Fill(ds, "HotelManage");
return ds;
}


public static SqlDataReader ExecuteDataReader(string sql, CommandType type, params SqlParameter[] ps)
{
SqlConnection connection = new SqlConnection(connString);
SqlCommand command = new SqlCommand(sql,connection);
command.CommandType = type;
if (ps != null)
command.Parameters.AddRange(ps);
connection.Open();
return command.ExecuteReader(CommandBehavior.CloseConnection);
}


public static int ExecuteNonQuery(string sql, CommandType type, params SqlParameter[] ps)
{
SqlConnection connection = new SqlConnection(connString);
SqlCommand command = new SqlCommand(sql, connection);
command.CommandType = type;
if (ps != null)
command.Parameters.AddRange(ps);
connection.Open();
int i = command.ExecuteNonQuery();
connection.Close();
return i;
}


public static object ExecuteScalar(string sql, CommandType type, params SqlParameter[] ps)
{
SqlConnection connection = new SqlConnection(connString);
SqlCommand command = new SqlCommand(sql, connection);
command.CommandType = type;
if (ps != null)
command.Parameters.AddRange(ps);
connection.Open();
object obj = command.ExecuteScalar();
connection.Close();
return obj;
}


}
}

xk1126 2010-06-05
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Text;
using RoomType.Model;

namespace RoomType.IDAL
{
public interface IRoomType
{
List<RoomTypes> SelectAll();
List<RoomTypes> SelectByAll(string name);
int Select(string name);
int Insert(RoomTypes roomType);
int Update(RoomTypes roomType);
int Delete(RoomTypes roomType);
}
}


抽象产品,也就是接口
xk1126 2010-06-05
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Text;

namespace RoomType.Model
{
[Serializable]
public class RoomTypes
{

public RoomTypes() { }

//编号ID
protected int _TypeID;
//类型名称
protected string _TypeName;
//价格
protected decimal _TypePrice=0.0m;
//加床价格
protected decimal _AddBedPrice=0.0m;
//是否加床
protected string _IsAddBed;
//备注
protected string _Remark;

/// <summary>
/// 备注
/// </summary>
public string Remark
{
get { return _Remark; }
set { _Remark = value; }
}
/// <summary>
/// 是否加床
/// </summary>
public string IsAddBed
{
get { return _IsAddBed; }
set
{
if (value.Trim() == "是" || value.Trim() == "否")
{
_IsAddBed = value;
}
else
{
throw new Exception("是否加床必须为:(是/否)?");
}
}
}
/// <summary>
/// 加床价格
/// </summary>
public decimal AddBedPrice
{
get { return _AddBedPrice; }
set
{
if (value >= 0)
{
_AddBedPrice = value;
}
else
{
throw new Exception("加床价格不能小于0!");
}
}
}
/// <summary>
/// 价格
/// </summary>
public decimal TypePrice
{
get { return _TypePrice; }
set
{
if (value >= 0)
{
_TypePrice = value;
}
else
{
throw new Exception("价格不能小于0!");
}
}
}
/// <summary>
/// 类型名称
/// </summary>
public string TypeName
{
get { return _TypeName; }
set { _TypeName = value; }
}
/// <summary>
/// 编号ID
/// </summary>
public int TypeID
{
get { return _TypeID; }
set { _TypeID = value; }
}
}
}


实体类实体类实体类实体类
yopky 2010-06-05
  • 打赏
  • 举报
回复
点解要用抽象类呢?
hejiasoft 2010-06-05
  • 打赏
  • 举报
回复
前段时间刚做完一个餐饮客房管理系统,如果不用TCP/IP协议的话,直接用简单的三层,如果服务器端需要进行监听的话,可以在服务器端监视TCP/IP端口获取数据
Alden 2010-06-05
  • 打赏
  • 举报
回复
当然不能为了三层而三层,不知道是你否明白为什么要使用三层结构,目的是什么,有什么利弊.如果这些明白了,你应该就知道如何作了.
rcy5211314 2010-06-05
  • 打赏
  • 举报
回复
上边很多人提点动软那东西,我也用户,确实很强大,但我不建议用它,因为他当不到理想的效果
bluedoctor 2010-06-05
  • 打赏
  • 举报
回复
flyerwing 2010-06-05
  • 打赏
  • 举报
回复
基本一样了!
搜索下,不放心的话。
加载更多回复(30)
课程通过实际项目融入常用开发技术架构,讲授风格独特,提供详细上课日志及答疑,赠送配套的项目架构源码注释详细清晰且表达通俗,均能直接在实际项目中应用,正真的物超所值,价格实惠任务作业:综合运用《C#/.Net企业级系统架构设计实战精讲教程》课程所学知识技能设计一个学生成绩管理系统的架构。要求:1.系统基于MVC的三层架构,各层单独建不同的解决方案文件夹。2.采用Model First开发方式,设计架构时只需要设计学生表(TbStudent)和课程表(TbCourse)。学生表必须有的字段是ID、stuName、age;课程表必须有的字段是ID、courseName、content。3.数据访问层采用Entity Framework或NHibernate来实现,必须封装对上述表的增删改查方法。4.必须依赖接口编程,也就是必须要有数据访问层的接口层、业务逻辑层的接口层等接口层。层层之间必须减少依赖,可以通过简单工厂或抽象工厂。5.至少采用简单工厂、抽象工厂、Spring.Net等技术中的2种来减少层与层之间的依赖等。6.封装出DbSession类,让它拥有所有Dal层实例和SaveChanges方法。7.设计出数据访问层及业务逻辑层主要类的T4模板,以便实体增加时自动生成相应的类。8.表现层要设计相关的控制器和视图来验证设计的系统架构代码的正确性,必须含有验证增删改查的方法。9.开发平台一定要是Visual Studio平台,采用C#开发语言,数据库为SQL Server。10.提交整个系统架构的源文件及生成的数据库文件。(注意: 作业需写在CSDN博客中,请把作业链接贴在评论区,老师会定期逐个批改~~)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧