下载地址:
http://www.netfocus.cn/downloaddetail10387.html简要说明:
学习了著名开源社区CommunityServer(CS)的抽象数据库的设计,自己独立思考,站在哲学的角度上思考问题,并进一步抽象,最终设计出了一套非常抽象的通用数据库以及通用数据访问层。
主要有以下优点:
1)通过两个抽象表存放任何数据实体以及实体之间的关系;
2)通过两种扩展字段设计方式实现任何数据实体的字段扩展需要,并且扩展的字段支持数据库级别的排序搜索功能;扩展字段的添加和一般字段没有什么大的区别,仅仅只是添加了一个特性而已。
3)由于将实体与实体之间的关系进行高度抽象(最终抽象为横向和父子递归两种关系),导致数据库访问层的接口的通用型非常广泛,可以适应任何实体之间的关系。这样的设计用一般的言语无法表达;也许你看了代码之后会有所体会;
4)吸取了CS中的很多好的设计,如Provider模式,动态构建SQL实现自定义查询,缓存,多语言资源文件设计,自定义Url重写,Ajax功能,etc.
5)目前该框架还在不断完善优化中。。
http://www.netfocus.cn/downloaddetail10387.html简要说明:
学习了著名开源社区CommunityServer(CS)的抽象数据库的设计,自己独立思考,站在哲学的角度上思考问题,并进一步抽象,最终设计出了一套非常抽象的通用数据库以及通用数据访问层。
主要有以下优点:
1)通过两个抽象表存放任何数据实体以及实体之间的关系;
2)通过两种扩展字段设计方式实现任何数据实体的字段扩展需要,并且扩展的字段支持数据库级别的排序搜索功能;扩展字段的添加和一般字段没有什么大的区别,仅仅只是添加了一个特性而已。
3)由于将实体与实体之间的关系进行高度抽象(最终抽象为横向和父子递归两种关系),导致数据库访问层的接口的通用型非常广泛,可以适应任何实体之间的关系。这样的设计用一般的言语无法表达;也许你看了代码之后会有所体会;
4)吸取了CS中的很多好的设计,如Provider模式,动态构建SQL实现自定义查询,缓存,多语言资源文件设计,自定义Url重写,Ajax功能,etc.
5)目前该框架还在不断完善优化中。。
解决方案 »
- 问个问题--------缓存依赖项!
- 有关asp.net中response.redirect路径问题
- C#web里GridView的用法
- *有没有完全免费的建站工具。
- 发布到2003服务器后,显示不了数据(在线等待)
- 请问我在建立ASPNET应用程序时,提示“检测到指定的web服务器运行的不是ASP.NET1.2版”
- 国内主流Asp.Net CMS介绍
- 怎么样在DataList中实现添加控件!
- 请问:如何在asp.net中,让datagrid实现在线编辑功能? 谢谢 很急! 在线等待!
- 请问操作EXCEL:"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\Book1.xsl;Extended Properties=Excel 8.0;";??
- Jmail问题,我发信后错误,我不止到怎么解决 ,我要疯了
- 自定义控件中的文本框onkeypress为什么会自动提交
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using Domain;
using Wuwei.ORM.Test;namespace TestDomain
{
class Program
{ static List<HasA> TestDatas = new List<HasA>(); static void Main(string[] args)
{
var s = Rnd.Next().ToString();
TestDatas.Add(new HasA() { Parent = s, Child = 2008 });
TestDatas.Add(new HasA() { Parent = s, Child = 2009 });
TestDatas.Add(new HasA() { Parent = "hello", Child = "world" });
using (var db = new Client())
{
TestDatas.ForEach(d => db.Save(d));
db.Commit();
}
new TestRunner().ConsoleStart(); //开始通过测试引擎驱动这些测试
} class Test1Class
{
public int X;
} [RunTest("测试Domain可以创建数据库文件。启动测试前请删除旧的数据库文件。", "08/8/20 7:00")]
static void Test1()
{
using (var d = new Client())
{
d.Save(new Test1Class { X = 1234 });
d.Commit();
"数据库文件不存在。".ThrowOutIf(() => !d.File.Exists);
}
using (var d = new Client())
{
"打开的数据库文件错误,或者保存对象错误。".ThrowOutIf(() => !d.Cast<Test1Class>().Any(a => a.X == 1234));
}
} static Random Rnd = new Random(); [RunTest("测试HasA可以保存,以及自动Rollback机制。", "08/8/20 7:20")]
static void Test2()
{
var s = Rnd.Next().ToString();
Client.ToDo(d =>
{
var m = new HasA() { Parent = s, Child = 123 };
d.Save(m);
d.Commit();
m.Parent = s + s;
d.Save(m); //测试随后(没有commit语句因此)自动rollback可以回滚数据。
});
Client.ToDo(d =>
{
var ts = "123443434";
var f = from HasA x in d where x.Parent.Equals(ts) select x;
ts = s;
" HasA无法保存或者冗余保存。".ThrowOutIf(() => f.Count() != 1);
});
}
[RunTest("测试10个Client线程并行查询数据库,结果完全一致。", "08/8/31 2:40")]
static void Test5()
{
var result = new List<int>();
var s = Rnd.Next().ToString();
1.ForEachNumTo(10, i =>
{
ThreadPool.QueueUserWorkItem(x =>
{
using (var d = new Domain.Client())
{
var f = from HasA h in d where h.Parent == Program.TestDatas[1].Parent select h;
result.Add(f.Count());
}
});
});
while (result.Count() < 10)
{
Thread.Sleep(1);
}
var value = result[1];
"并行查询出错。".ThrowOutIf(() => result.Any(x => x != value));
}
在一个简单的测试程序驱动下,它会去寻找所有的这些测试程序(大型系统往往可以有上千个测试),并且(只要我没有中断它)会成千上次地随机执行测试。开源软件要比那些用钱堆出来的软件项目更应该重视自动化测试。
UP。
JF。
呵呵,你可以事后才补充测试,也可以事前就开始测试,从前一种变为后一种开放方法其实对探索性的项目的开发至关重要的。我很熟悉vs上的 Ctrl+K+M 快捷功能——自动生成方法存根。当我不过度技术化的时候(而是紧贴目标去开发的时候),我会先设计接口,然后就开始写测试程序,测试程序中自然要new被测试对象,写好代码后我都习惯了“F5”,此时肯定编译通不过,因为这个被测试对象根本没有实现,这就是我开发的启动动作。如果事后再做测试,你几乎无法真正做全面的功能测试,只能做几个简单的测试了事。很难有人会愿意在写完全部实现代码之后才去怀疑自己的代码的。只有TDD观念才能最好地保证产品质量。
sp1234说的太对了
两年前考软设的时候接触过不少这样的理论性的东西
不过两年的工作过程中从没接触过这样做的人
哎~~
另外,相对于之前的版本Demo的功能以及框架本身的设计方面都有了很大的改善,欢迎大家来下载使用。