zoukankan      html  css  js  c++  java
  • 开源抽象工厂模式,序列化,反序列化等..

    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、创建工厂类,利用反射返回IsettingsELF

    SettingManager.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、抽象工厂模式

  • 相关阅读:
    从句分析
    artDialog ( v 6.0.2 ) content 参数引入页面 html 内容
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 11 盛最多水的容器
    Java实现 LeetCode 11 盛最多水的容器
  • 原文地址:https://www.cnblogs.com/axyz/p/1955443.html
Copyright © 2011-2022 走看看