开源抽象工厂模式,序列化,反序列化等..

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

原文地址:https://www.cnblogs.com/axyz/p/1955443.html