概要:自从上次写了一篇关于YZR.Data和YZR.Data webconfig配置的相关介绍之后,就没有再提及到相关的点了,这里会补上这些天框架的补充优化以及各部分再单独提一下,也简单写一下使用场合.
YZR.Data类库是对数据的操作,其中对Sqlserver数据库的支持是通过RMotion,对Oracle是通过RAction,RDataBase是作为数据库判断的共同父类,IDataBase则是作为数据库操作类对象的规范和标准,通常就是一个接口.RPro提供对存储过程的支持,RDic,RWhere,KeyValuePair,DbAction,DbHelper,DbParam等作为自定义的操作辅助类.
谈一下扩展性,比如面向MySQL的开发,在YZR.Data中可以通过一个相似于RAction或者RMotion的处理类,这样YZR.Data即可以支持MySQL,在UI层只需要在AppStart中预加载和在webconfig配置连接字符串即可.
谈一下功能,目前支持:CURD,事务,自定义Sql,存储过程.
谈一下性能,底层基本通过反射技术实现,Model使用枚举,减少了对"对象"的操作.
Note:能写出YZR.Data不是一两天的事情,也是多年对大牛作品的仔细解读和自己花功夫思考,本人看过不少好的框架,这里只是作为个人研究,代码都是原创,但思路可能同出一辙.
这样,在我的项目上,不管要求是什么数据库,都能很快有一套成熟的框架来进行开发.
YZR.Entity类库使用的是枚举的形式,在进行框架编写的时候,没有面向对象那样操作起来简单,但是性能是强于实体的,而且也更容易操作和理解,因为枚举比对象简单得多.
Custom文件夹:考虑到开发往往需要自定义,这里提供一个入口进行自定义实体的定义.
TableNames:面向单数据库的开发,那么TableNames枚举就可以搞定了,但考虑到大项目复杂的数据库设计,这边就需要手动增加相应的枚举类文件.
经常使用多层框架的开发,那么对Core层应该很熟悉,YZR.Core核心层,交互的一边是YZR.Data,另一边是YZR.Logic.Core是框架对数据流程的统一操作,YZR.Data数据操作实例的获取以及管理,编写处理类,页面类的父类的地方.
AjaxBase:一般处理程序的父类,框架的统一操作,系统的登录验证,集成权限以及Response输出等.
DbManager,DBUtilityManager:对YZR.Data操作数据库对象实例的管理,注册等
Enum:action操作的枚举
FileExtend:文件以及文件夹的IO流操作类
LogicBase是面向Logic层的父类,PageBase是UI层页面的父类,IBase则是统一的规范标准.
SqlCode则是对自定义sql的支持.
业务逻辑层,项目都有一定的业务,这里规定一个业务新建相应的业务处理类即可,SysLogic是系统业务逻辑,LuckdrawLogic是抽奖逻辑.Aop是切面编程操作类.
然而,往往单一逻辑的CURD,我们可以不写一句代码,直接由框架的统一处理类即可完成,这里在SysLogic或者LuckdrawLogic逻辑类中编写的应该是重写相关的复杂逻辑的CURD方法.
UI层是传统的webform
App_Data:开发者可以将Sql语句或者Sql文件放在这里.
AppStart:根据webconfig得到相应的YZR.Data数据操作实例
namespace YZR.UI.AppStart { using YZR.Config; public static class AppStart { /// <summary> /// 应用程序入口 By YZR /// </summary> public static void Init() { string Title = WebSettingManager.WebSetting.BaseSetting.title + " - " + WebSettingManager.WebSetting.BaseSetting.subTitle; int count = WebSettingManager.WebSetting.StrConnSetting.Count; Dictionary<string, string> dic = new Dictionary<string, string>(); for (int i = 0; i < count; i++) { connSection section = WebSettingManager.WebSetting.StrConnSetting[i]; dic.Add(section.Rname, section.Rvalue); } //string strConn = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["default"].ConnectionString; //string connString = System.Configuration.ConfigurationManager.ConnectionStrings["connString"].ToString(); string ProviderName = System.Configuration.ConfigurationManager.ConnectionStrings["connString"].ProviderName; string path = AppDomain.CurrentDomain.BaseDirectory; Assembly ass = Assembly.LoadFrom(path + "bin\\YZR.Data.dll"); //Assembly ass = Assembly.Load("YZR.Entity"); //TODO:Oracle数据库使用RAtion,Sqlserver使用RMotion Type type = null; string value = dic["Oracle"]; if (value.Equals(ProviderName, StringComparison.OrdinalIgnoreCase)) { type = ass.GetType("YZR.Data." + "RAction"); } else { value = dic["Sqlserver"]; if (value.Equals(ProviderName, StringComparison.OrdinalIgnoreCase)) { type = ass.GetType("YZR.Data." + "RMotion"); } else throw new Exception("配置节点出错"); } //ConstructorInfo c = type.GetConstructor(new Type[] { typeof(string) });//构造函数的实参类型 //c.Invoke(new object[] { "SYS_ADMIN" });//实参 //TODO:在这里需要将所有Entity注册进DbUtilityManager中 if (type != null) { Type tableType = typeof(TableNames); string[] tableNames = tableType.GetEnumNames(); for (int i = 0; i < tableNames.Length; i++) { object fobj = Activator.CreateInstance(type, new object[] { tableNames[i] }); DbUtilityManager.RegistDbUtility(tableNames[i], fobj); } } } } }
R_System:存放开发的处理程序和页面
webconfig:详细请看YZR.Data webconfig文章.
日志操作类:
RSystemError:简单的文本文件的方式记录.(单文件的写入)
LogHelper:使用Log4Net日志组件.相关请查看我的博客:Log4Net日志组件
缓存处理类:
Cache:存放缓存处理类
Enum:枚举缓存Type
ICache:Cache的接口父类
RCache是作为统一的处理类.
namespace YZR.RCache { public class RCache { private static ICache Icache; // cache对象 private static RCache instance = null; //缓存实例 public static RCache GetInstance(CacheType type) { switch (type) { case CacheType.MemCache: //Icache = new MemCachedStrategy(); break; case CacheType.MemCacheAndWebCache: //Icache = new MemCachedAndWebStrategy(); break; case CacheType.WebCache: Icache = new WebCache(); break; case CacheType.XMLCache: //Icache = new XMLCacheStrategy(); break; case CacheType.RedisCache: //Icache = new RedisCacheStrategy(); break; } if (instance != null) return instance; RCache temp = new RCache(); System.Threading.Interlocked.CompareExchange(ref instance, temp, null); return instance; } //构造方法让它私有化,这样外界就不能通过 new 来实例化了 private RCache() { } /// <summary> /// 添加缓存 /// </summary> /// <param name="key"></param> /// <param name="obj"></param> public virtual void AddItem(string key, object obj) { Icache.Add(key, obj); } /// <summary> /// 新增或者更新缓存 推荐使用 /// </summary> /// <param name="key"></param> /// <param name="obj"></param> public virtual void SetItem(string key, object obj) { Icache.Set(key, obj); } /// <summary> /// 添加缓存依赖文件 /// </summary> /// <param name="key"></param> /// <param name="obj"></param> public virtual void AddItemWithFileChange(string key, object obj, string[] files) { Icache.AddItemWithFileChange(key, obj, files); } /// <summary> /// 移除单个缓存 /// </summary> /// <param name="key"></param> public virtual void RemoveItem(string key) { Icache.Remove(key); } /// <summary> /// 移除所有缓存 /// </summary> public virtual void RemoveALLItem() { Icache.RemoveALL(); } /// <summary> /// 获取缓存对象 /// </summary> /// <param name="xpath"></param> /// <returns></returns> public virtual object GetItem(string key) { return Icache.GetItem(key); } } }
缓存代理类:
YZR.Comm,YZR.Utility是常用类,帮助类,比如WebHelper.cs,ScriptHelper.cs,EncrpytHelper.cs等
YZR.Config是webconfig节点的配置类库.
就介绍到这里了!