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