2008年6月15日
一.层是指什么?为什么要分层?
对于层的概念,我的理解是包括"抽象层"和"实现层", 即是OO五大原则之依赖倒置原则(DIP), 让你的应用依赖于抽象而不是具体实现. 最常见的做法是加入数据访问的抽象层, 以此来解除对数据库类型的依赖.
二.要分哪些层?
需要解藕哪些层, 就分出哪些层.
三.一般都需要解藕哪些层?
1.数据访问层, 解除对数据库类型的依赖.
2.实体层,这主要是因为在ORM的存在, 让Model变的臃肿, 违反了OO五大原则之单一职责原则(SRP):本来一个实体只有表示数据的职责, 现在还多了数据持久化的职责.如果说数据访问层或ORM解除了对数据库类型的依赖, 则数据访问层+实体层就是解除了对数据库类型和数据访问方式的依赖.对开发者来说, 好处就是前期可以使用ORM减少数据访问操作的复杂度, 后期可以根据需求,将部分实现替换成ADO.NET等高效率数据访问方式, 以扩展的形式快速的应对变化.附一个UML图:

3.业务逻辑层.
很少业务逻辑层能复杂到需要将每个功能都抽象出来, 所以并不需要做到上面两种那样.一般来说, 策略模式+模板方法模式就可以满足需求了.
4.表示层.
表示层的模式,常见的有MVC和MVP.MVC适合做展示数据的前台网站,MVP的特点是可以不依赖UI层,换句话说,你可以做一个Web的表示层,再做一个WinForm的表示层.至于WebForm模型, 能玩的花样很多, 关键看用的人的水平了.
有空打算写一个类似
<<微型项目实践>>系列的文章, 说明如何开发一个可扩展,易测试,易修改的.NET项目,以及各种常用开发组件在项目中的使用,如企业库,NLog,PostSharp(AOP框架)等.
2008年5月24日
摘要: 在ASP.NET中, 我们要获取控件的值, 或是给控件赋值, 一般都是Control.Property = Entity.Property, Entity.Property = Control.Property.如果控件太多,这样写就显的繁琐,而且容易出错.这种情况下, 使用反射, 把符合控件名和实体属性名相同的值相互映射,只要一行代码就可以完成操作了.来看主要的两个方法签名:Code highl...
阅读全文
2008年5月6日
之前写的那篇<<
一个极其简单的在线C#IDE例子>>, 貌似很合大众胃口.这次我又想到一个种运行时编译执行代码的应用, 不过比较简单就是.
比如Math.dll程序集有个计算器的类
namespace Account


{

/**//// <summary>
/// 计算器
/// </summary>
public class Calcualtor

{
public int Add(int x, int y)

{
return x + y;
}
}
}
现在我们的程序当中, 要使用计算器的功能.但是我们还并没有具体的
Calcualtor类, 所以我们用一个接口来表示:

/**//// <summary>
/// 计算器接口
/// </summary>
public interface ICalculator

{
int Add(int x, int y);
}
在依赖注入中,经常会这么做.但是,这时候的Calcualtor类并没有实现ICalcualtor这个接口.怎么办?看测试:
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestDynamicObjectPool


{

/**//// <summary>
/// 计算器接口
/// </summary>
public interface ICalculator

{
int Add(int x, int y);
}

[TestClass()]
public class DynamicObjectPoolTest

{
[TestMethod()]
public void GetInstanceTest()

{
//参数按顺序为:目标类程序集,目标类Namespace,目标类名,所依赖的其它程序集(这里为测试自身程序集)
ICalculator proxy = DynamicObject.GetObject<ICalculator>("Account", "Account", "Calcualtor", "TestDynamicObjectPool.dll");
Assert.AreEqual(2, proxy.Add(1, 1));
}
}
}

使用ICalculator就可以调用到Calculator类的方法实现了.
实现的原理很土很简单, 就是动态生成一个代理类:
using System;
using System.Collections.Generic;

namespace DynamicProxy


{

public class CalcualtorProxy : Account.Calcualtor, TestDynamicObjectPool.ICalcualtor
{ }
}
这种方法的拘束很大, 比如目标类必需可以被继承,要有无参构造函数等.这里纯粹是说个想法, 仅供娱乐.
完整代码下载 :
DynamicObjectPool.rar
2008年5月5日
摘要: 五一时去朋友那, 他问了个小问题, 只要写几十行代码就可以很好的说明问题.可偏偏机子没装VS, 只好做罢.回来后想想, 要是有个在线的C#IDE就好了.于是上网查了下相关的资料, 整出来个简单的在线C#IDE.
做这个,主要要解决两个问题, 一是如果将网页上文本框的代码编译并执行;二是如果将程序运行结果在网页上输出.
第一个问题不难, .NET已经有现成的C#编译类CSharpCodeProvider(或是其它语言的),再使用CompilerParameters类做为编译参数,就可以很容易的实现.
第二个问题, 举最简单情况, 就是将Console.Write方法输出的内容在网页上显示出来.这其实也很好办,只要在编译之前, 在输出语句做一个替换, 将输出的内容存到另一个地方.等运行结束后, 再从那个地方取出来就是了.
阅读全文
2008年5月4日
摘要: 我们在写程序当中, 经常需要检验数据是否符合规则, 比如不能为空, 必需为Email或手机格式等.于是, 在我们的代码中, 就会出现很多重复的诸如此类的校验代码.然后我就想到, 用Attribute的方式, 为需要校验的对象属性加上规则, 再用统一的方法去获取并校验数据是否符合规则.Attribute的定义如下:Code highlighting produced by Actipro CodeH...
阅读全文
2008年5月2日
摘要: 这是FastDev.Core程序集中的一个类Converters, 用于数据类型转换.使用方法: Converters.ChangeType<T>(toChangeObject) 或 toChangeObject.ChangeType<T>() 测试如下:Code highlighting produced by Actipro CodeHighlighter (freew...
阅读全文
2008年5月1日
FastDev是我这一年来, 在开发中总结积累而写的一些方便开发的组件.主要是用于ASP.NET开发.像邮件发送组件,静态页组件,数据验证组件等等.
今天先介绍一下这个邮件发送组件.
先说使用啊,首先是配置文件, FastDev.config, 放置于根目录下.
<?xml version="1.0"?>
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FastDev.xsd">
<configSections>
<sectionGroup name="FastDev">
<section name="Mail" type="FastDev.Mail.MailConfig, FastDev.Mail" allowDefinition="Everywhere" allowLocation="true"/>
</sectionGroup>
</configSections>
<FastDev>
<Mail>
<Configs>
<add Name="163" FromAddress="xiaosonl@163.com" UserName="xiaosonl" Password="XXX"/>
<!--EnableSsl是否使用SSL加密,例如GMail就使用SSL.-->
<add Name="gmail" FromAddress="xiaosonl@gmail.com" UserName="xiaosonl@gmail.com" Password="XXX" EnableSsl="true" Port="587"/>
</Configs>
</Mail>
</FastDev>
</configuration>
每个<add />节点对应一个MailClient类的配置, 使用MailClientManager.GetMailClient方法获取指定的MailClient, 接受名称或顺序参数:
public static MailClient GetMailClient(string name)

public static MailClient GetMailClient(int index)
然后是发邮件方法:

/**//// <summary>
/// 发送邮件
/// </summary>
/// <param name="subject">标题</param>
/// <param name="body">正文</param>
/// <param name="toAddress">接收方地址</param>
/// <param name="isAsync">是否异步发送</param>
public void SendMail(string subject, string body, string toAddress, bool isAsync)
调用MailClient.SendMail方法发送就可以了.
源代码及示例下载:
FastDev.Mail.rar
2007年6月25日
之前写的那篇<<
发布一个未完善的分页DataList控件 -- PageDataList>>没看过的请先看看.
这次主要几个改进:
1.修正了几个明显的BUG.
2.FootTemplate中的分页子控件为可选的,比如只需上一页和下一页,就只要像下面这样写就可以了.
<FooterTemplate>
<asp:HyperLink ID = "lnkPageUp" Text = "上一页" runat = "server" />
<asp:HyperLink ID = "lnkPageDown" Text = "下一页" runat = "server" />
</FooterTemplate>
3.改进的分页参数.可以自动识别URL在其后加上page=XX用于标识当前页.
PageDataList1.1.rar
2007年5月21日
前一两周公司要做网站,分析之后决定使用NBear做为ORM工具.于是开始学习NBear,在学习和使用过程中,越来越发现NBear给开发带来的便利.
现在把自己整理的学习资料发布上来与大家共享(其实就是Teedy的BLOG的离线版的......).
Teddy是个挺热心的人,有问题他都会尽快的给予解答.在这里赞一个.
NBear资料.rar