建设银行网站打不开别的网站可以吗,十大免费跨境app,做的网站打印全乱掉了,英文版网站怎么做我们设计的分层架构#xff0c;层与层之间应该是松散耦合的。因为是单向单一调用#xff0c;所以#xff0c;这里的“松散耦合”实际是指上层类不能具体依赖于下层类#xff0c;而应该依赖于下层提供的一个接口。这样#xff0c;上层类不能直接实例化下层中的类#xff0…我们设计的分层架构层与层之间应该是松散耦合的。因为是单向单一调用所以这里的“松散耦合”实际是指上层类不能具体依赖于下层类而应该依赖于下层提供的一个接口。这样上层类不能直接实例化下层中的类而只持有接口至于接口所指变量最终究竟是哪一个类则由依赖注入机制决定。 之所以这样做是为了实现层与层之间的“可替换”式设计例如现在需要换一种方式实现数据访问层只要这个实现遵循了前面定义的数据访问层接口业务逻辑层和表示层不需要做任何改动只需要改一下配置文件系统即可正常运行。另外基于这种结构的系统还可以实现并行开发。即不同开发人员可以专注于自己的层次只有接口被定义好了开发出来的东西就可以无缝连接。 在J2EE平台上主要使用Spring框架实现依赖注入。这里我们将自己做一个依赖注入容器。 依赖注入的理论基础是Abstract Factory设计模式这里结合具体实例简单介绍一下。 上图以数据访问层为例展示了Abstract Factory模式的应用。如图现假设有针对Access和SQLServer两种数据库的数据访问层它们都实现了数据访问层接口。每个数据访问层有自己的工厂所有工厂都实现自IDALFactory接口。而客户类这里就是业务逻辑层类仅与工厂接口、数据访问层接口耦合而与具体类无关这样只要通过配置文件确定实例化哪个工厂就可以得到不同的数据访问层。 然而这种设计虽然可行但是代码比较冗余因为这样需要为数据访问层的每一个实现编写一个工厂业务逻辑层也一样。在以前我们毫无办法但是.NET平台引入的反射机制给我们提供了一种解决方案。使用反射每个层只需要一个工厂然后通过从配置文件中读出程序集的名称动态加载相应类。另外为了提高依赖注入机制的效率这里引入缓存机制。下面来看具体实现。 配置首先需要在Web工程的Web.config文件的appSettings节点下添加如下两个项add keyDAL value/add keyBLL value/ 这两个配置选项分别存储要应用的数据访问和也业务逻辑层的程序集名称。value目前是空是因为目前还没有各个层次的具体实现。 实现缓存操作辅助类 为实现缓存操作我们将缓存操作封装成一个辅助类放在Utility工程下具体代码如下 using System;using System.Web;using System.Web.Caching;namespace NGuestBook.Utility{ /**//**//**//// summary /// 辅助类用于缓存操作 /// /summary public sealed class CacheAccess { /**//**//**//// summary /// 将对象加入到缓存中 /// /summary /// param namecacheKey缓存键/param /// param namecacheObject缓存对象/param /// param namedependency缓存依赖项/param public static void SaveToCache(string cacheKey, object cacheObject, CacheDependency dependency) { Cache cache HttpRuntime.Cache; cache.Insert(cacheKey, cacheObject, dependency); } /**//**//**//// summary /// 从缓存中取得对象不存在则返回null /// /summary /// param namecacheKey缓存键/param /// returns获取的缓存对象/returns public static object GetFromCache(string cacheKey) { Cache cache HttpRuntime.Cache; return cache[cacheKey]; } }} 封装依赖注入代码 因为很多依赖注入代码非常相似为了减少重复性代码我们将可复用的代码先封装在一个类中。具体代码如下这个类放在Factory工程下 using System;using System.Configuration;using System.Reflection;using System.Web;using System.Web.Caching;using NGuestBook.Utility;namespace NGuestBook.Factory{ /**//**//**//// summary /// 依赖注入提供者 /// 使用反射机制实现 /// /summary public sealed class DependencyInjector { /**//**//**//// summary /// 取得数据访问层对象 /// 首先检查缓存中是否存在如果不存在则利用反射机制返回对象 /// /summary /// param nameclassName数据访问类名称/param /// returns数据访问层对象/returns public static object GetDALObject(string className) { /**//**//**//// summary /// 取得数据访问层名称首先检查缓存不存在则到配置文件中读取 /// 缓存依赖项为Web.Config文件 /// /summary object dal CacheAccess.GetFromCache(DAL); if (dal null) { CacheDependency fileDependency new CacheDependency(HttpContext.Current.Server.MapPath(Web.Config)); dal ConfigurationManager.AppSettings[DAL]; CacheAccess.SaveToCache(DAL, dal, fileDependency); } /**//**//**//// summary /// 取得数据访问层对象 /// /summary string dalName (string)dal; string fullClassName dalName . className; object dalObject CacheAccess.GetFromCache(className); if (dalObject null) { CacheDependency fileDependency new CacheDependency(HttpContext.Current.Server.MapPath(Web.Config)); dalObject Assembly.Load(dalName).CreateInstance(fullClassName); CacheAccess.SaveToCache(className, dalObject, fileDependency); } return dalObject; } /**//**//**//// summary /// 取得业务逻辑层对象 /// 首先检查缓存中是否存在如果不存在则利用反射机制返回对象 /// /summary /// param nameclassName业务逻辑类名称/param /// returns业务逻辑层对象/returns public static object GetBLLObject(string className) { /**//**//**//// summary /// 取得业务逻辑层名称首先检查缓存不存在则到配置文件中读取 /// 缓存依赖项为Web.Config文件 /// /summary object bll CacheAccess.GetFromCache(BLL); if (bll null) { CacheDependency fileDependency new CacheDependency(HttpContext.Current.Server.MapPath(Web.Config)); bll ConfigurationManager.AppSettings[BLL]; CacheAccess.SaveToCache(BLL, bll, fileDependency); } /**//**//**//// summary /// 取得业务逻辑层对象 /// /summary string bllName (string)bll; string fullClassName bllName . className; object bllObject CacheAccess.GetFromCache(className); if (bllObject null) { CacheDependency fileDependency new CacheDependency(HttpContext.Current.Server.MapPath(Web.Config)); bllObject Assembly.Load(bllName).CreateInstance(fullClassName); CacheAccess.SaveToCache(className, bllObject, fileDependency); } return bllObject; } }} 实现工厂 下面使用两个辅助类实现数据访问层工厂和业务逻辑层工厂。 using System;using NGuestBook.IDAL;namespace NGuestBook.Factory{ /**//**//**//// summary /// 数据访问层工厂用于获取相应的数据访问层对象 /// 使用Abstract Factory设计模式Facace设计模式反射机制缓存机制设计 /// /summary public sealed class DALFactory { /**//**//**//// summary /// 获取管理员数据访问层对象 /// /summary /// returns管理员数据访问层对象/returns public static IAdminDAL CreateAdminDAL() { return (IAdminDAL)DependencyInjector.GetDALObject(AdminDAL); } /**//**//**//// summary /// 获取留言数据访问层对象 /// /summary /// returns留言数据访问层对象/returns public static IMessageDAL CreateMessageDAL() { return (IMessageDAL)DependencyInjector.GetDALObject(MessageDAL); } /**//**//**//// summary /// 获取评论数据访问层对象 /// /summary /// returns评论数据访问层对象/returns public static ICommentDAL CreateCommentDAL() { return (ICommentDAL)DependencyInjector.GetDALObject(CommentDAL); } }} using System;using NGuestBook.IBLL;namespace NGuestBook.Factory{ /**//**//**//// summary /// 业务逻辑层工厂用于获取相应的业务逻辑层对象 /// 使用Abstract Factory设计模式Facace设计模式反射机制缓存机制设计 /// /summary public sealed class BLLFactory { /**//**//**//// summary /// 获取管理员业务逻辑层对象 /// /summary /// returns管理员业务逻辑层对象/returns public static IAdminBLL CreateAdminBLL() { return (IAdminBLL)DependencyInjector.GetBLLObject(AdminBLL); } /**//**//**//// summary /// 获取留言业务逻辑层对象 /// /summary /// returns留言业务逻辑层对象/returns public static IMessageBLL CreateMessageBLL() { return (IMessageBLL)DependencyInjector.GetBLLObject(MessageBLL); } /**//**//**//// summary /// 获取评论业务逻辑层对象 /// /summary /// returns评论业务逻辑层对象/returns public static ICommentBLL CreateCommentBLL() { return (ICommentBLL)DependencyInjector.GetBLLObject(CommentBLL); } }} 转载于:https://www.cnblogs.com/dreamszx/archive/2008/08/01/1258068.html