DANIU.CORE
Access: Common:OledbHelper.cs相当于sqlhelper,其他的类文件作用与dal层文件类似,主要与数据库打交道的。 Common文件夹:主要是一些全局静态方法,字段等。 Data:很多借口,抽象工厂设计模式? Entity:实体类 Service:各种管理类DANIU.WEB
admin:后台管理程序 app_data:数据库,目前为access bin:类库,目前包括DANIU.CORE和NVelocity.dll common: config:rewrite是url重写,feed应该是来管理订阅到,目前不知道咋用。 css:css文件 editor:ckediter组件。 images:图片 scripts:js文件,包括jquery和一些组件等 tools:用来生成验证码 themes:模板文件 app_code:App_Code文件夹正好在Web应用程序根目录下,其存储所有应当作为应用程序的一部分动态编译的类文件。 这些类文件自 动链接到应用程序,而不需要在页面中添加任何显式指令或声明来创建依赖性。 App_Code文件夹中放置的类文件可以包含任何可识别的ASP.NET组 件 ——自定义控件、辅助类、build提供程序、业务类、自定义提供程序、HTTP处理程序等。 注意在开发时,对App_Code文件夹的更改会导致整个应 用程序重新编译。 对于大型项目,这可能不受欢迎,而且很耗时。为此,鼓励大家将代码进行模块化处理 到不同的类库中,按逻辑上相关的类集合进行组织。应用程序专用的辅助类大多应当放置在App_Code文件夹中。抽象工厂模式实现:
1、建立借口(IsettingsELF) 2、创建settingELF类,实现接口IsettingsELF a、实现接口1:根据settinginfo类更新设置信息,传参数前需要先将settinginfo类序列化为字符串。 b、实现接口2:获取设置信息,需要将从数据库中读取的字符串反序列化为ettinginfo类。 3、创建工厂类,利用反射返回IsettingsELFSettingManager.GetSetting().SiteName
把setting相关东西都在总结一遍: 1、settinginfo:实体类,和数据库表里的setting字段里的xml中的字段对应。 2、接口isetting,包含更新setting和读取setting 3、实现类setting:isetting 实现对settings的更新(updatesetting),这里接触到了xml的序列化。更新的时候需要把类序列化为xml字符串,存入数据库。 实现对setting的读取操作(getsetting),这里使用反序列化,反序列化需要传入反序列化的类型(settinginfo)和字符串。从数据中获取xml字符串,然后反序列化为settinginfo. 4、工厂类:Dataaccess 如下为petshop4.0中类似地方的应用。道理都一样的,petshop将对应的不同的命名空间配置在数据库中,而此源码中将其直接写死在字段中。 private static readonly string path = ConfigurationManager.AppSettings["WebDAL"]; private static readonly string orderPath = ConfigurationManager.AppSettings["OrdersDAL"]; public static PetShop.IDAL.ICategory CreateCategory() { string className = path + ".Category"; return (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className); } 以下为本例的实现,不同点在于: 1、定义了全局静态变量,利用泛型来创建,这里问了源码作者,他的解释是这2种方式差不多,现在这样少了一些冗余代码。 不知道这样是否会减少一些消耗,因为有if (_instance==null)的判断。 private static readonly string path = "DANIU.core.Sqlserver"; private static object lockhelper = new object(); public static IsettingsELF _isetting = null;public static IsettingsELF CreateSetting()
{ string className = path + ".settingsELF"; return CreateInstance<IsettingsELF>(_isetting, className); }public static T CreateInstance<T>(T _instance, string className)
{ if (_instance==null) { lock (lockhelper) { if (_instance==null) { _instance = (T)Assembly.Load(path).CreateInstance(className); } } } return _instance; }5、管理类:settingmanager,这个类用来管理settinginfo这个类的,也是所有功能的入口。所有外部调用都走settingmanager.
public class SettingManager
{ //定义内部访问字段,使用工厂方法读取IsettingsELF static IsettingsELF dao = DANIU.core.Data.DataAccessELF.CreateSetting(); private static SettingInfo _setting; private static object lockHelper = new object();//构造函数初始化_setting
static SettingManager() { LoadSetting(); }//初始化读取setting
public static void LoadSetting() { if (_setting == null) { lock (lockHelper) { if (_setting == null) { _setting = dao.GetSetting(); } } } }//返回_setting
public static SettingInfo GetSetting() { return _setting; }//更新setting
public static bool UpdateSetting() { bool result = dao.UpdateSetting(_setting); return result; } }重要知识点:
1、序列化,反序列化(需再深入理解,实践。) 2、抽象工厂模式