目标:1适用小型项目,比如业务逻辑很简单的企业网站,什么新闻发布啦,产片展示啦。2通用的,不针对某一项目。带箭头的虚线表示依赖关系,业务逻辑层只依赖数据访问层接口和实体,通用类。
主要接口代码:
    public interface IDALContext : IDisposable
    {
        //该方法可返回IDALDase,IDALTUser,IDALTRole,可利用反射实现返回不同类型实例
        TDAL GetDAL<TDAL>() where TDAL : class; 
    }
    public interface IDALBase
    {
        DataTable GetDataTable(String commandText);
        DataTable GetDataTable(String commandText, CommandType type);
        DataTable GetDataTable<TParameter>(String commandText, params TParameter[] parameters)
            where TParameter : DbParameter;
        DataTable GetDataTable<TParameter>(String commandText, CommandType type, params TParameter[] parameters)
            where TParameter : DbParameter;        int ExecuteNonQuery(String commandText);
        int ExecuteNonQuery(String commandText, CommandType type);
        int ExecuteNonQuery<TParameter>(String commandText, params TParameter[] parameters)
            where TParameter : DbParameter;
        int ExecuteNonQuery<TParameter>(String commandText, CommandType type, params TParameter[] parameters)
            where TParameter : DbParameter;
        TCommand GetCommand<TCommand>()
            where TCommand : DbCommand;
    }
public interface IDALTUser
    {        TUser SelectFirst(params ConditionPairs[] conditionPairs);
        TUser SelectFirst(int index, params ConditionPairs[] conditionPairs);
        TUser SelectFirst(OrderPair orderPair, params ConditionPairs[] conditionPairs);
        TUser SelectFirst(OrderPair orderPair, int index, params ConditionPairs[] conditionPairs);
        TUser SelectFirst(OrderPair[] orderPairs, params ConditionPairs[] conditionPairs);
        TUser SelectFirst(OrderPair[] orderPairs, int index, params ConditionPairs[] conditionPairs);        List<TUser> Select(params ConditionPairs[] conditionPairs);
        List<TUser> Select(int count, params ConditionPairs[] conditionPairs);
        List<TUser> Select(int index, bool all, params ConditionPairs[] conditionPairs);
        List<TUser> Select(int index, int count, params ConditionPairs[] conditionPairs);
        List<TUser> Select(OrderPair orderPair, params ConditionPairs[] conditionPairs);
        List<TUser> Select(OrderPair orderPair, int count, params ConditionPairs[] conditionPairs);
        List<TUser> Select(OrderPair orderPair, int index, bool all, params ConditionPairs[] conditionPairs);
        List<TUser> Select(OrderPair orderPair, int index, int count, params ConditionPairs[] conditionPairs);
        List<TUser> Select(OrderPair[] orderPairs, params ConditionPairs[] conditionPairs);
        List<TUser> Select(OrderPair[] orderPairs, int count, params ConditionPairs[] conditionPairs);
        List<TUser> Select(OrderPair[] orderPairs, int index, bool all, params ConditionPairs[] conditionPairs);
        List<TUser> Select(OrderPair[] orderPairs, int index, int count, params ConditionPairs[] conditionPairs);        int Delete(params ConditionPairs[] conditionPairs);        int Insert(TUser user);        int Update(SetPair setPair, params ConditionPairs[] conditionPairs);
        int Update(SetPair[] setPairs, params ConditionPairs[] conditionPairs);        int GetCount(params ConditionPairs[] conditionPairs);        TUser GetModel(String commandText);
        TUser GetModel(String commandText, CommandType type);
        TUser GetModel<TParameter>(String commandText, params TParameter[] parameters)
           where TParameter : DbParameter;
        TUser GetModel<TParameter>(String commandText,CommandType type, params TParameter[] parameters)
           where TParameter : DbParameter;
        List<TUser> GetModels(String commandText);
        List<TUser> GetModels(String commandText, CommandType type);
        List<TUser> GetModels<TParameter>(String commandText, params TParameter[] parameters)
           where TParameter : DbParameter;
        List<TUser> GetModels<TParameter>(String commandText,CommandType type, params TParameter[] parameters)
   where TParameter : DbParameter;
    }
IDALTRole和IDALTUser是类似的。
公共类说明:
/// <summary>
    /// 判断的操作符
    /// </summary>
    public enum ConditionOperation
    {
        Equal = 1,
        GreaterThan,
        GreaterOrEqual,
        LessThan,
        LessOrEqual,
        NotEqual
    }    public enum LogicalOperation
    {
        And=1,
        Or
    }
ConditionPair,该类的每个实例表示一个条件,如login_name='king'这个条件可用该实例new ConditionPair("login_name","king",ConditionOperation.Equal )表示.    ConditionPairs表示多个条件放在一起,如login_name='king' and password='123'可用实例new ConditionPairs(LogicalOperation.And,new ConditionPairs("login_name","king"),new ConditionPair("password","123"))表示    SetPair表示一个排序规则,如order by login_name desc可用实例new SetPair("login_name",true)表示调用举例:
String connStr=System.Configuration.ConfigurationManager.ConnectionStrings["connectionString1"].ConnectionString;
            using (IDALContext dalContext = new DALContext(connStr))
            {
                IDALTUser dalUser=dalContext.GetDAL<IDALTUser>();
                gv1.DataSource = dalUser.Select();
                gv1.DataBind();                gv2.DataSource = dalUser.Select(2, 5);
                gv2.DataBind();                gv3.DataSource = dalUser.Select(new OrderPair("create_datetime",true));
                gv3.DataBind();                gv4.DataSource = dalUser.Select(new ConditionPairs(new ConditionPair[]{new ConditionPair("id",11,ConditionOperation.GreaterThan),
                    new ConditionPair("id",15,ConditionOperation.LessThan)}));
                gv4.DataBind();                gv5.DataSource=dalUser.Select(new ConditionPairs(new ConditionPair[]{
                    new ConditionPair("id",11,ConditionOperation.GreaterOrEqual),
                    new ConditionPair("id",15,ConditionOperation.LessOrEqual)}),
                    new ConditionPairs(LogicalOperation.Or,new ConditionPair[]{
                        new ConditionPair("login_name","king")}),
                    new ConditionPairs(LogicalOperation.Or,new ConditionPair[]{
                        new ConditionPair("login_name","magic")}));
                gv5.DataBind();                gv6.DataSource=dalUser.Select(new ConditionPairs(new ConditionPair[]{
                    new ConditionPair("id",15,ConditionOperation.GreaterThan,LogicalOperation.Or),
                    new ConditionPair("id",3,ConditionOperation.LessThan,LogicalOperation.Or)}),
                    new ConditionPairs(LogicalOperation.And,new ConditionPair[]{
                        new ConditionPair("create_datetime",new DateTime(2011,7,25,11,19,10),ConditionOperation.GreaterThan)}
                        ));
                gv6.DataBind();                gv7.DataSource = dalUser.Select(new OrderPair[] { new OrderPair("id"), new OrderPair("bh", true) }, 2, 3,
                    new ConditionPairs(new ConditionPair[]{new ConditionPair("id",17,ConditionOperation.GreaterOrEqual),
                        new ConditionPair("id",20,ConditionOperation.LessOrEqual)}),
                        new ConditionPairs(LogicalOperation.Or, new ConditionPair("login_name", "king")),
                        new ConditionPairs(LogicalOperation.Or, new ConditionPair("login_name", "magic")));
                gv7.DataBind();                gv8.DataSource =new List<TUser>(){ dalUser.SelectFirst(new ConditionPairs(new ConditionPair[]{
                    new ConditionPair("login_name","king")}))};
                gv8.DataBind();                IDALBase dalBase = dalContext.GetDAL<IDALBase>();
                gv9.DataSource = dalBase.GetDataTable("select * from t_user");
                gv9.DataBind();                
            }还不能实现的功能:不支持表间连接查询,不支持事务,执行具体的sql语句时传递数据库参数时不能和具体的数据库参数类型解耦。请大家赐教参数解耦的问题,接口设计的可行性,合理性,如果成熟了计划写一个生成该设计中实体类和具体数据库实现的代码生成器

解决方案 »

  1.   

    看了下结构,如果lz要支持切换数据库的话在加个工厂类,依赖配置文件进行实例化dal
    这样当要切换数据库时不用去改动bll
      

  2.   

    数据访问层建议用NHiberate配置数据库访问配置文件,以达到数据访问层的通用,从而与底层的数据库系统无关。
      

  3.   

    好像是一个SQLHelper。这有很多了理论上还不错。可是一到事件,就又回到原始社会了。
      

  4.   

    楼主,你的DAL包含太多BLL的东西了
    要自己写DAL的话,仿照ADO写个先
      

  5.   

    贴一段代码:
    protected DataTable GetData_MaterialSearch() { 
        //调用视图驱动器更新Model
        ViewDrv.MethodViewDrv.UpdateParams(this, this.Model.MethodMaterialSearch);
        //调用DAL获取数据,当然你可以使用JsonTable做为数据传送载体
        DataTable _DT = DAHelper.ExecuteMethod(this.Model.MethodMaterialSearch);
        if(_DT == null) throw new MyException("操作失败,请稍后重试");
        return _DT;
        }//end GetData_MaterialSearch