当前位置:编程学习 > C#/ASP.NET >>

关于三层架构代码实现求助!!!!

最近看这个三层,看了好久了,都一直是迷迷糊糊的,虽然明白了他们的作用,但也还只是一只半解,求高手不惜授教!

假如我做一个项目,UI层肯定是自己去使用BLL层的接口去实现功能

但问题就来了
1.BLL层和DAL能否实现使用代码生成器生成?代码生成器生成的这些代码是否需要我用手动去修改?
2.关于三层,除了UI层,其它层里面的细层又有哪些啊?对于增添的层,我应该如何大概的实现?
3.关于代码生成器codesmith,我看到网上有nettier,好像还有entilib等,这是些什么啊?4.可是我看到有些视频说到IDAL层,DALPROVIDER层,这又是怎么一个回事?
5.最好能给我一个大概的整体项目实施的流程。



高手快来啊!! 架构 代码生成器 --------------------编程问答-------------------- www.51aspx.com
下几个项目 对比一下 分析一下~~~

IDAL层,DALPROVIDER
这两个层是一般是为了为了切换数据库
IDAL
IStudentManager
{
void Add(Student entity)
}

SqlServerDAL
StudentManager
{
public void Add(Student entity)
{//sqlserver insert sql}
}

MySqlDAL
StudentManager
{
public void Add(Student entity)
{//mysql insert sql}
}

如是想使用sql server数据库
IStudentManager sm = new SqlServerDAL.StudentManager();

如是想使用mysql数据库
IStudentManager sm = new MySqlDAL.StudentManager();//当然这种new方式是很恶心的~
//所以一般都会有工厂模式,我这里也只是写个大概~~~~ 但现在我喜欢IOC,工厂模式很少用了~

不是几句话可以说明白的~~~
--------------------编程问答-------------------- 我见过很多培训班,连接口都没有用就写出了“三层架构”。

还有的培训班把增删查改愣是写到3个类中,叫“三层架构”。

所以在提问前,你先说清楚培训班是怎么教你的。 --------------------编程问答-------------------- 反正培训班教的那套根本是没用的,毕业以后也迟早是要转行的。所以表面上很多人问“三层架构”,其实是在问培训班教他们的那套程序怎么糊出来。所以你得让人知道你们培训班教你的都是什么牛头马面的“三层架构”。 --------------------编程问答-------------------- 增删改查至少我还懂好摆,我自己学是自己做一个sqlhelper,把基本的数据库的使用封装在里面,只让他返回TABLE或是DATASET。然后在DAL里实现接口功能

但我一直就在想,nettier是否应该就可以直接实现从数据库里得到结构后写成DAL层(虽说自己可以写个简单的代码生成器完成)。但毕竟不如那些牛人写的,也没得其它的模式可用。觉得还是想用工具舒服。


所以现在最大的问题就是,我即便使用nettier,似乎也实现不一个简单的程序,所以郁闷,想找高人解决 --------------------编程问答-------------------- IDAL层,DALPROVIDER
这两个层是一般是为了为了切换数据库
IDAL
IStudentManager
{
void Add(Student entity)
}

SqlServerDAL
StudentManager
{
public void Add(Student entity)
{//sqlserver insert sql}
}

MySqlDAL
StudentManager
{
public void Add(Student entity)
{//mysql insert sql}
}

如是想使用sql server数据库
IStudentManager sm = new SqlServerDAL.StudentManager();
--------------------编程问答-------------------- 希望有朋友使用VS2010+nettier自动生成过代码的高手,告诉我一下如何结合数据库生成可用的代码的全过程
有视频尤佳!!
能给我详细的过程,也行,只要能实现,我将再多送分!

我用的是win7 + VS2010+SQL2008R2 --------------------编程问答-------------------- http://community.codesmithtools.com/CodeSmith_Community/b/tutorials/archive/2006/02/13/nettiers.aspx --------------------编程问答-------------------- 所谓的“三层”,确实头疼,体现在扩展强。总之,头疼费解。
备注:加油 --------------------编程问答-------------------- 来公司快5个月了,架构理解了,用的命令空间没见过,看了头疼,怕了 --------------------编程问答-------------------- 推荐一本书:Microsoft.Press.Building.Enterprise.Applications.with.Windows.Presentation.Foundation.and.the.Model.View.ViewModel.Pattern.Mar.2011
这本对于分层 模块化 解耦 等等 模式应用 讲的很明白透彻,你可以拜读一下…… --------------------编程问答-------------------- 我用codesmith生成的代码通过编绎了,然后我怎么使用里面生成的接口什么的?是否我还需要建一个BLL层,求略为具体的操作!! --------------------编程问答-------------------- 我用codesmith生成的代码通过编绎了,然后我怎么使用里面生成的接口什么的?是否我还需要建一个BLL层,求略为具体的操作!! --------------------编程问答-------------------- 你的那种所谓代码生成器,就是为了弄一个所谓的DAL用的。有它没它都没有什么意义。因为我们可以直接使用EF或者ADO.NET来加载对象集合,用不着什么生成器。例如我们可以写

2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
            List<MyObj> result;
            using (var conn = new OracleConnection(cnStr))
            {
                conn.Open();
                var comm = conn.CreateCommand();
                comm.CommandText = "select a.TheName, b.Number from Table1 as a inner join Table2 as b on ..........";
                comm.CommandType = System.Data.CommandType.Text;
                result = ( from DbDataRecord record in comm.ExecuteReader()
                            let name = (string)record["TheName"]
                            select new TableDefine { 
                                            Name = name,
                                            Value = (double)record["Number"]
                                       };
                         ).ToList();
            }   
 

这就直接查询出来一个 List<TableDefine>集合。

你所谓的动软之类的东西,我懒得去纠结它,但是至少,它跟BLL根本不沾边。

所谓BLL层,体现了软件服务器端Api设计经验,体现了管理人员的长远设计。一套BLL层接口,可以长期地给各种平台的不同客户端应用共享,用来隔离前端UI程序开发,让前端开发人员不用去操心后台操作(不用去操心后台用了多少个数据库、多少个服务器、多少远程服务和其它驱动。

BLL层的设计完全是业务发展需要、完全是业务设计。跟什么关系数据库没有半点关系。

因此如果说“能够从数据库表就推断出BLL”,那么你100%是被人骗了。 --------------------编程问答--------------------             List<TableDefine > result;
            using (var conn = new OracleConnection(cnStr))
            {
                conn.Open();
                var comm = conn.CreateCommand();
                comm.CommandText = "select a.TheName, b.Number from Table1 as a inner join Table2 as b on ..........";
                comm.CommandType = System.Data.CommandType.Text;
                result = ( from DbDataRecord record in comm.ExecuteReader()
                            let name = (string)record["TheName"]
                            select new TableDefine { 
                                            Name = name,
                                            Value = (double)record["Number"]
                                       };
                         ).ToList();
            }   


如果只是为了封装个对象,就像上面的TableDefine这样,你会用“动软”之类的吗?

呵呵! --------------------编程问答-------------------- 关于如何写DAL的问题,我尽量不参与。面对好几年“为了三层而三层”的那种过度宣传,我只能稍微强调一点说“其实你不写什么DAL,只要写足够多的BLL就是三层”。因为我们都知道去寻找比较好用的关系数据库“增删改查”驱动框架,这些都是DAL,甚至是很好的ORM(ORM是一种面向对象的通用DAL)。

学校里没有教会学生去分析BLL层吗?那么这就是缺乏“三层”。

不能说整天纠结在“数据库表增删改查”反而是三层开发。实际上那种为了三层而三层的,它的BLL层里边只有很简单的“薄薄一层”代码,不过是调用DAL。这叫什么BLL呢? --------------------编程问答--------------------
引用
关于如何写DAL的问题,我尽量不参与。面对好几年“为了三层而三层”的那种过度宣传,我只能稍微强调一点说“其实你不写什么DAL,只要写足够多的BLL就是三层”。因为我们都知道去寻找比较好用的关系数据库“增删改查”驱动框架,这些都是DAL,甚至是很好的ORM(ORM是一种面向对象的通用DAL)。

学校里没有教会学生去分析BLL层吗?那么这就是缺乏“三层”。

不能说整天纠结在“数据库表增删改查”反而是三层开发。实际上那种为了三层而三层的,它的BLL层里边只有很简单的“薄薄一层”代码,不过是调用DAL。这叫什么BLL呢?

好祟拜。。。

大神,要不手把手教下俺吧,俺自学未成材。。。搞别人的视频去搞,大概的懂了个什么叫三层,无奈总觉得代码生成器生成的代码好用,结果用了,现在发现后面不知道怎么继续下去,为了这个搞了半个月了,悲剧哇……偶滴Q 247_677_87.....24小时在线等大神。谢谢 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 16 楼 terry888_ 的回复:
引用
关于如何写DAL的问题,我尽量不参与。面对好几年“为了三层而三层”的那种过度宣传,我只能稍微强调一点说“其实你不写什么DAL,只要写足够多的BLL就是三层”。因为我们都知道去寻找比较好用的关系数据库“增删改查”驱动框架,这些都是DAL,甚至是很好的ORM(ORM是一种面向对象的通用DAL)。

学校里没有教会学生去分析BLL层吗?那么这就是缺乏“三层”。

不能说整天纠结在“数据库表增删改查”反而是三层开发。实际上那种为了三层而三层的,它的BLL层里边只有很简单的“薄薄一层”代码,不过是调用DAL。这叫什么BLL呢?

好祟拜。。。

大神,要不手把手教下俺吧,俺自学未成材。。。搞别人的视频去搞,大概的懂了个什么叫三层,无奈总觉得代码生成器生成的代码好用,结果用了,现在发现后面不知道怎么继续下去,为了这个搞了半个月了,悲剧哇……偶滴Q 247_677_87.....24小时在线等大神。谢谢


代码生成器生成的东西,只有dal层,如果你不打算以后频繁换数据库(这种需求我目前还没遇到过)。你完全可以删掉整个bll层,自己写业务代码然后去调用它。这样你的bll才有意义。 --------------------编程问答--------------------
代码生成器生成的东西,只有dal层,如果你不打算以后频繁换数据库(这种需求我目前还没遇到过)。你完全可以删掉整个bll层,自己写业务代码然后去调用它。这样你的bll才有意义。


大神,能指导我写一个获得UI层的GetByUserName的代码不?使用Codesmith生成的DAL,以及教我写一下BLL,同时还能帮我解释一下生成的那么代码分别是些什么?跪拜啊! --------------------编程问答--------------------
引用 4 楼 terry888_ 的回复:
增删改查至少我还懂好摆,我自己学是自己做一个sqlhelper,把基本的数据库的使用封装在里面,只让他返回TABLE或是DATASET。然后在DAL里实现接口功能

但我一直就在想,nettier是否应该就可以直接实现从数据库里得到结构后写成DAL层(虽说自己可以写个简单的代码生成器完成)。但毕竟不如那些牛人写的,也没得其它的模式可用。觉得还是想用工具舒服。


所以现在最大的问题就是,我即便使用nettier,似乎也实现不一个简单的程序,所以郁闷,想找高人解决


我首先建议你多练习,多读书,多练习……你可以一直用你的SqlHelper,只要用它能做出东西来,那也是好的。在问所谓三层这些东西之前,你要先把基础搞扎实。下面我简单回复一下“三层”的问题。简单答案是:Don't give a shit to it.

为什么呢?三层也好,两层也好,365层也罢,都不过是为了让你的程序更健壮,为了让后续开发更简单。面向对象设计有5大原则,这也是我力挺的5大原则,我给你链接,你可以看一下:http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)

无须死板的去套这些原则,但是在你设计程序结构的时候,你至少应该考虑到这些东西,因为不管你是几层也好,分层的目的无非就是为了尽量向这些原则靠拢。

另外一点:一个健壮的程序应该是可以“自己”发现问题的。如何做到这点?这就是人们一直在说的测试驱动。当然,我不认为所有的代码都应该先有测试再有实现,但更重要的是,你的程序应该是可测试的。什么是可测试的?我们来看一下小段伪代码:

public void ProcessOrder(Order order)
{
    // 我们在这里对order做检测,如果它与数据库里的其他order存在
    // 命名冲突,则throw Exception
    // ProductsManagerDbContext 是一个类似于EntityFramework的DBContext类
    var db = new ProductsManagerDbContext(whateverSqlConnString);
    if (db.Orders.FindByName(order.Name) != null)
    {
        throw new Exception("Order name conflicts");
    }
    //...省略其他代码
}


上面的代码有问题吗?乍看没什么问题。但是你如何测试它?你要知道,你的Validation是与EntityFramework高度耦合起来的。如果你要测试,你则需要提供数据库连接,这显然违背了UnitTest的本意,因为你在测试ProcessOrder的同时,也在测试EntityFramework,可是EntityFramework已经被微软的小伙伴测试过了,何必劳你来测试?

那么如何解决这个耦合问题?很简单,用接口就可以。

interface IOrderValidator(Order order) {
    bool ValidateName(Order order); // Returning true means there is no conflict
}



public void ProcessOrder(Order order, IOrderValidator validator)
{
    // 我们在这里对order做检测,如果它与数据库里的其他order存在
    // 命名冲突,则throw Exception
    if (!validator.ValidateName(order))
    {
        throw new Exception("Order name conflicts");
    }
    //...省略其他代码
}


看上面的有什么变化?很明显,我们只声明了我们需要一个IOrderValidator接口,这样至少可以把ProcessOrder跟EntityFramework解耦。然后有人就问了:那谁负责传递真正的validator,很明显它目前还是空值。很简单,你需要一个Dependency Injection的框架,具体怎么做,自己去查吧,这里讲不完的。

那么测试的时候怎么办?测试的时候你需要测试框架,比如NUnit,而测试框架多半都会提供Mock功能,即你可以在runtime的时候凭空造一个假的IOrderValidator的实现,然后把它赋给ProcessOrder,这样一来,即使不连数据库,你的ProcessOrder一样可以被测试。

那么什么测试要连数据库?一些更底层的测试,如对IOrderValidator的EntityFramework实现的测试。





--------------------编程问答-------------------- 楼上的大神,我真的是菜鸟,东西完全自学,也木有开发经历


你说的多看书是有道理,我想大家上这里来问主要是不想多走弯路,减少不必要的时间浪费和体能消耗

关于SQLHELPER的方法,我觉得还算好用,只是使用自己编的代码生成器,在使用的过程中总是有或多或少的使用问题,尤其是针对变动,我发现自己要做的改动会有不少,小项目如果说可以维护和扩展,但一大了就没办法了。其次就是代码的生成质量没办法保证

这两天一直在看codesmith生成的类,因以前朋友用的版本跟我现在的不一样,生成的代码也不一样,所以暂时只明白了实体类好像是在Entiters下面,只是里面还有其它好多代码不懂。还有就是最最基本的DAL也还没明白,我看到好像是有用到BASE,但毕竟迷茫啊。其它类的功能也不知道。

比如,数据库里一个表operator,那我如何实现让这个表里的数据通过dataview显示。能解释下其它的更好,在此大谢过!!



求解求解。。。
只求使用,不求精通啊。。。 --------------------编程问答--------------------
引用 21 楼 terry888_ 的回复:
楼上的大神,我真的是菜鸟,东西完全自学,也木有开发经历


你说的多看书是有道理,我想大家上这里来问主要是不想多走弯路,减少不必要的时间浪费和体能消耗

关于SQLHELPER的方法,我觉得还算好用,只是使用自己编的代码生成器,在使用的过程中总是有或多或少的使用问题,尤其是针对变动,我发现自己要做的改动会有不少,小项目如果说可以维护和扩展,但一大了就没办法了。其次就是代码的生成质量没办法保证

这两天一直在看codesmith生成的类,因以前朋友用的版本跟我现在的不一样,生成的代码也不一样,所以暂时只明白了实体类好像是在Entiters下面,只是里面还有其它好多代码不懂。还有就是最最基本的DAL也还没明白,我看到好像是有用到BASE,但毕竟迷茫啊。其它类的功能也不知道。

比如,数据库里一个表operator,那我如何实现让这个表里的数据通过dataview显示。能解释下其它的更好,在此大谢过!!



求解求解。。。
只求使用,不求精通啊。。。


…………求精通是求不来的。我个人认为,读书比去各种论坛提问要有效的多。我日常的工作是做桌面软件开发的,而我所有的web开发知识,至少有60%是来自于各类书籍。但是如果你想通过书本获取知识,你的英文阅读一定要过关,因为我可能没有任何国内IT著作推荐给你。国外的倒是有一堆可以推荐的。
--------------------编程问答-------------------- 下载一个动软代码生成器,准备一个数据库,里面添加一点数据,安装生成器打开并链接上数据库,选择三层架构,选择对应的表,然后生成就可以了,可能需要改一下连接字符串,然后在表示层调用BLL里的方法 --------------------编程问答-------------------- #22#

引用
…………求精通是求不来的。我个人认为,读书比去各种论坛提问要有效的多。我日常的工作是做桌面软件开发的,而我所有的web开发知识,至少有60%是来自于各类书籍。但是如果你想通过书本获取知识,你的英文阅读一定要过关,因为我可能没有任何国内IT著作推荐给你。国外的倒是有一堆可以推荐的。



真是服了大神了,给我个详细的过程不就得了么,你们打字的时间都可以帮我这个菜鸟把问题解决了。

--------------------编程问答--------------------
引用
下载一个动软代码生成器,准备一个数据库,里面添加一点数据,安装生成器打开并链接上数据库,选择三层架构,选择对应的表,然后生成就可以了,可能需要改一下连接字符串,然后在表示层调用BLL里的方法
 


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PROCESS.Entities;
using PROCESS.Data;

namespace Processors
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

       
        
        private void Form1_Load(object sender, EventArgs e)
        {
            TList<Product> products = DataRepository.ProductProvider.GetAll();
            dataGridView1.DataSource = products;
            [/code]
但是结果还是报错。。。。。新手调代码水平很烂的。。。


报错内容为
Error 1 The type or namespace name 'Data' does not exist in the namespace 'PROCESS' (are you missing an assembly reference?) E:\Processors\Processors\Form1.cs 10 15 Processors


动软的我也试了,最简单的那种,跟我现在用SQLHELPER的方式是一样的,使用有点不爽,这种瘦瘦的代码,感觉用起来不放心。
用工厂模式,我也是类似我的想法那样去实现,也报类似的错误。所以迷茫了。

求解……………………………………………………………………!!!!!!!!!!!



还有,我看到有一个源代码,他有点像三层,但只是封在两个类里面。但有一点做得很好,就是所有的调用的函数都是被封装在一个类中的。所以我在想,我这里是否也可以通过修改BLL来实现,如何实现。 --------------------编程问答--------------------
引用 24 楼 terry888_ 的回复:
#22#

引用
…………求精通是求不来的。我个人认为,读书比去各种论坛提问要有效的多。我日常的工作是做桌面软件开发的,而我所有的web开发知识,至少有60%是来自于各类书籍。但是如果你想通过书本获取知识,你的英文阅读一定要过关,因为我可能没有任何国内IT著作推荐给你。国外的倒是有一堆可以推荐的。



真是服了大神了,给我个详细的过程不就得了么,你们打字的时间都可以帮我这个菜鸟把问题解决了。


何必让我给你详细过程,难道我要坐飞机飞到你电脑前帮你调试么。。。?
至于你给出的error:
The type or namespace name 'Data' does not exist in the namespace 'PROCESS' (are you missing an assembly reference?) E:\Processors\Processors\Form1.cs 10 15 Processors

除非我远程登录你的机器帮你看,否则我只能得出你的类Data不存在于PROCESS命名空间下的结论。 --------------------编程问答-------------------- 何必让我给你详细过程,难道我要坐飞机飞到你电脑前帮你调试么。。。?
至于你给出的error:
The type or namespace name 'Data' does not exist in the namespace 'PROCESS' (are you missing an assembly reference?) E:\Processors\Processors\Form1.cs 10 15 Processors

除非我远程登录你的机器帮你看,否则我只能得出你的类Data不存在于PROCESS命名空间下的结论。


新手啊新手。。。大神要是有空的话,就远程帮我下吧。本人感激不尽啊。。。
QQ 247_677_87    每天等大神。。。 --------------------编程问答-------------------- 大神是怎么炼成的?膜拜 --------------------编程问答--------------------
引用 25 楼 terry888_ 的回复:
动软的我也试了,最简单的那种,跟我现在用SQLHELPER的方式是一样的,使用有点不爽,这种瘦瘦的代码,感觉用起来不放心。
 用工厂模式,我也是类似我的想法那样去实现,也报类似的错误。所以迷茫了。

 求解……………………………………………………………………!!!!!!!!!!!



 还有,我看到有一个源代码,他有点像三层,但只是封在两个类里面。但有一点做得很好,就是所有的调用的函数都是被封装在一个类中的。所以我在想,我这里是否也可以通过修改BLL来实现,如何实现。 


满脑子只有DAL的话,还考虑什么“三层”呢?你就直接用UI层访问你的数据库驱动就行了!没有必要再写三层。

如果任凭怎样都不能理解为什么要做一件事,你仅仅为了滥竽充数而要求别人给你“详细代码”?这没有必要。 --------------------编程问答-------------------- 进行三层设计,它就是为了让设计师将后台系统仍然是面向应用服务而完备地进行设计,它研究的是“前端需要哪一种服务”上,而不要去纠结数据库表增删改查。

例如前端需要的上百个服务,其中之一是“获取在某个小区范围内的所有超时的维修任务”,这个操作可能需要读取两个数据库中的7个数据表,但是前端根本不关心。也许过了1个月,重构了,这个操作重构为仅需要读取2个数据库中的3个数据库表、加上一个配置文件和一个json文件,就行了,前端根本不需要关心。也许有过了2个月,这个操作还需要重构,仅需要读取1个数据库中的2个数据表,已经另外一个“维修抢修系统”的api和另外一个“客服”系统的api,前段也不需要关心。

有这个设计能力叫做BLL层设计。你要是知道BLL,再来反观你一直反复纠结的那个DAL层次,就会发现“三层”的含义了。 --------------------编程问答-------------------- “动软”之类的东西,微软.net中8年前的PetShop小范例,甚至微软早期的EF等等,都是制造“伪三层”的罪魁祸首。 --------------------编程问答-------------------- 先分清三层架构和两层架构:一个是client->DB server,一个是client->web server->Db Server.
有些系统,架构上只有两层,client->db,那么即便你提炼了接口和Bll,就系统架构而言还是两层。
然后才是分层,三层架构的系统,可以三层,也可以是目前也流行4层,SOA.多一个服务层。现在去封装ORM,个人觉得相当多余,我们项目组几年前基于ado.net自己开发了一个小心orm,诟病重重,现在用用ef省时省力,最应该封装的是业务,当架构层面趋于稳定,通过项目,慢慢提炼业务,提炼到一定的程度就慢慢有了工作流,业务引擎,慢慢积累,产品才会逐步做好。 --------------------编程问答--------------------
引用 3 楼 caozhy 的回复:
反正培训班教的那套根本是没用的,毕业以后也迟早是要转行的。所以表面上很多人问“三层架构”,其实是在问培训班教他们的那套程序怎么糊出来。所以你得让人知道你们培训班教你的都是什么牛头马面的“三层架构”。

扯谁说的??我今年刚从培训班出来,工作也没遇到多少困难..去了就直接跟着做项目了
补充:.NET技术 ,  .NET Framework
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,