zoukankan      html  css  js  c++  java
  • N层架构实现的一个小例子

    主要用到了[单例,抽象工厂,缓存,N层,反射]等知识。架构图如下:

    解决方案用到的项目列表如下:

    1. 在接口项目中,定义一个IUER接口。
    namespace IDAL
    {
        public interface IUser
        {
            int Delete(string userId);
            int Delete(Entity.User user);
        }
    }

         2.在DALSQLProvider项目中,进行对IUSER接口的实现,针对SQL SERVER数据库。[Oracle同]

    namespace DALSQLProvider
    {
        public class User : IDAL.IUser
        {
            #region IUser 成员
    
            public int Delete(string id)
            {
                throw new NotImplementedException();//ADO.NET
            }
    
            public int Delete(Entity.User user)
            {
                throw new NotImplementedException();//ADO.NET
            }
    
            #endregion
        }
    }

    3.DALFactory类库项目实现抽象出对所有接口(相当于一个系列),以后进行产品族选择配置(4)。

    namespace DALFactory
    {
        public abstract class DalFactory
        {
            //一个系列,里面接口数量对应于IDAL中的接口
            public abstract IDAL.IUser UserDALProvider
            {
                get;
            }
        }
    }

    4.DALSQLProvider项目对DALFactory类库项目进行实现,返回DALSQLProvider项目User类的实例[Orcale同]

    namespace DALSQLProvider
    {
        public class UserDALSQLFactory : DALFactory.DalFactory
        {
            public override IDAL.IUser UserDALProvider
            {
                get
                {
                    //   return new User();
                    //添加缓存,避免每次都NEW对象。
                    DALSQLProvider.User obj = System.Web.HttpContext.Current.Cache.Get("IDAL.IUser") as DALSQLProvider.User;
                    if (obj == null)
                    {
                        var instance = new User();
                        System.Web.HttpContext.Current.Cache.Add("IDAL.IUser", instance, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);
                        return instance;
                    }
                    return obj;
                }
            }
        }
    }

    5.业务逻辑层实现数据访问层定义的接口。在这个地方用反射根据加载的程序集(DALSQLProvider.dll/DALOracleProvider.dll)进行实例化类。用单例保证不出现多个对象。

    namespace BLL
    {
        public class DALProvider
        {
            private static DalFactory instance;
            private DALProvider() { }
            static DALProvider()
            {
                //根据WebConfig获取具体的provider
                string dllFileName = System.Web.Configuration.WebConfigurationManager.AppSettings["DataProviderDllFile"];
                string dalFactoryClassName = System.Web.Configuration.WebConfigurationManager.AppSettings["DataProviderFactoryName"];
    
                System.Reflection.Assembly dll = System.Reflection.Assembly.LoadFile(System.Web.HttpContext.Current.Server.MapPath("~/DataProvider/" + dllFileName));//把要加载的程序集放在项目的DataProvider目录下,
    
                instance = dll.CreateInstance(dalFactoryClassName) as DalFactory;
            }
    
            public static DalFactory DefaulProvider
            {
                get
                {
                    return instance;
                }
            }
        }
    }
    namespace BLL
    {
        public class User
        {
            DalFactory provider = DALProvider.DefaulProvider;
    
            public int deleteUser(string id)
            {
                return provider.UserDALProvider.Delete(id);
            }
        }
    }

    6.业务逻辑在页面进行展现。

           protected void Button1_Click(object sender, EventArgs e)
            {
                BLL.User u = new BLL.User();
                this.Button1.Text = u.deleteUser("1").ToString();
            }

  • 相关阅读:
    Kinect 开发 —— 硬件设备解剖
    Kinect 开发 —— 引言
    (转)OpenCV 基本知识框架
    OpenCV —— 摄像机模型与标定
    OpenCV —— 跟踪与运动
    OpenCV —— 图像局部与分割(二)
    OpenCV —— 图像局部与部分分割(一)
    OpenCV —— 轮廓
    OpenCV —— 直方图与匹配
    OpenCV —— 图像变换
  • 原文地址:https://www.cnblogs.com/hometown/p/3254911.html
Copyright © 2011-2022 走看看