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

  • 相关阅读:
    素因子分解
    【转载】一张表看懂LTE和5G NR的区别
    看国家宝藏,顺便学习一下国密算法
    LTE-Advanced(4G)主要技术学习:CA、CoMp、HetNet
    未来移动通信的需求与挑战
    傅里叶级数
    正余弦函数的复指数表示
    网络基础——相关面试考点
    操作系统——相关面试考点
    小米2015笔试编程题
  • 原文地址:https://www.cnblogs.com/axyz/p/1955443.html
Copyright © 2011-2022 走看看