也可以叫四层:逻辑层(BLL),数据层(DAL),WEB层,还有一个公共的Components组件层(不知道这样说对不对)。Components包括Model(对应数据库中的表)、interface(接口,对应相关对象的操作)、自定义控件等内容,BLL通过抽象工厂实现业务逻辑,DAL则实现接口定义的方法,实现数据库的操作。
但是有些问题我总是不太懂,因为才学这东西,总想着先把框架想清楚,以下是我不懂的几个方面,希望知道的能给我解释一下:
先举个例子,一个网站的友情链接管理模块(FriendLink),先定义其Model,然后是接口IFriendLink,在DAL层中实现接口方法(此时的FriendLink类继承自IFriendLink),在抽象工厂中有如下代码
 private static readonly string path = ConfigurationManager.AppSettings["WebDAL"];//从web.config里获得数据层的程序集名,这里得到的是DAL下的程序集
    
public static IFriendLink CreateFriendLink()
        {
            string className = path + ".FriendLink";//程序集+类名,得到类的类型全名
            return (IFriendLink)Assembly.Load(path).CreateInstance(className);// path是dll的路径,classname是命名空间和类名  
        }//传说中的反射~~~创建类的一个对象,相当于new class()
(当然还有其它模块对象的实例,这样说我又不知道对不对,因为我不知道这其中的反射有什么作用!)
然后在BLL层中有如下代码:
 private static readonly IFriendLink friendLink = DataAccess.CreateFriendLink();
        /// <summary>
        /// 获取友情链接
        /// </summary>
        /// <returns></returns>
        public static IList<FriendLinkInfo> GetLinks(LinkItemType linkType)
        {
            return friendLink.GetLinks(linkType);//这个方法当然是在先前的IFriendLink类中定义过
        }问题来了:
1.抽象工厂到底实现了什么?有什么意义?它是不是必须的?为什么不直接在BLL中就调用DAL中实现的方法,而要在BLL中涉及到抽象工厂;
2.看起来所有的方法(即操作)都是与数据库挂勾,但是我并不确定,希望有人能给我个肯定的回答;
3.我理解的三层对吗?有什么不对的还请高手们给我讲讲,越详细越好。

解决方案 »

  1.   

    Model层:using System;
    using System.Collections.Generic;
    using System.Text;namespace hytd.Model
    {
        public class UserInfo
        {
            private int _iD;
            public int ID
            {
                get { return _iD; }
                set { _iD = value; }
            }        private string _userName;
            public string UserName
            {
                get { return _userName; }
                set { _userName = value; }
            }        private string _pwd;
            public string Pwd
            {
                get { return _pwd; }
                set { _pwd = value; }
            }        private string _joinDate;
            public string JoinDate
            {
                get { return _joinDate; }
                set { _joinDate = value; }
            }    }
    }DAL层:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using hytd.Model;
    using System.Data;
    using System.Data.OleDb;
    namespace hytd.DAL
    {
        public class UserManager
        {        public  DBHelpersClass DBHelps = new DBHelpersClass();        public List<UserInfo> GetUserInfo()
            {
                string strSql = "select * from UserInfo";            try
                {
                    DataTable dt = DBHelps.GetDataTable(strSql);
                    List<UserInfo> ListUserInfo = new List<UserInfo>();                for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        UserInfo UI = new UserInfo();                    UI.UserName = Convert.ToString(dt.Rows[i]["UserName"]);
                        UI.Pwd = Convert.ToString(dt.Rows[i]["Pwd"]);                    ListUserInfo.Add(UI);
                    }                return ListUserInfo;
                }
                catch
                {
                    return null;
                }
                finally
                { }       
            }    }
    }BLL层:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using hytd.Model;
    using hytd.DAL;
    using System.Data;
    using System.Data.OleDb; public List<UserInfo> GetUserInfo()
            {
                return UM.GetUserInfo();
            }看明白了吗??MODEL层:对应数据库中的表 字段属性
    DAL层:是具体功能的实现 如select语句查询
    Bll层:直接调用DAL层的方法
    WEB层:直接调用BLL层的方法:这样 DAL层就被保护起来了,我们是通过BLL层访问DAL层
     
    我也刚学c#,刚接触的这些东西,根据自己的编写经验总结出来的,呵呵,概念性的东西我不知道!
      

  2.   

    刚才看错了!呵呵
    不过c#三层模式和ASP.net 差不多吧!
      

  3.   

    工厂的功能就是让程序扩展性更强 其实是一种设计模式
    可以去看下PetShop 4.0 里面的代码比较详细 
    基础先明白,其实三层比较适合开发 自己写小DEMO的话不需要那么麻烦~!