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框架)等.

posted @ 2008-06-15 01:22 xiaosonl 阅读(2128) | 评论 (23)编辑

2008年5月24日

     摘要: 在ASP.NET中, 我们要获取控件的值, 或是给控件赋值, 一般都是Control.Property = Entity.Property, Entity.Property = Control.Property.如果控件太多,这样写就显的繁琐,而且容易出错.这种情况下, 使用反射, 把符合控件名和实体属性名相同的值相互映射,只要一行代码就可以完成操作了.来看主要的两个方法签名:Code highl... 阅读全文
posted @ 2008-05-24 16:25 xiaosonl 阅读(1611) | 评论 (5)编辑

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(11));
        }

    }

}

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

namespace DynamicProxy
{
    
public class CalcualtorProxy : Account.Calcualtor, TestDynamicObjectPool.ICalcualtor { }
}
    这种方法的拘束很大, 比如目标类必需可以被继承,要有无参构造函数等.这里纯粹是说个想法, 仅供娱乐.

   完整代码下载 : DynamicObjectPool.rar
posted @ 2008-05-06 23:12 xiaosonl 阅读(1529) | 评论 (6)编辑

2008年5月5日

     摘要: 五一时去朋友那, 他问了个小问题, 只要写几十行代码就可以很好的说明问题.可偏偏机子没装VS, 只好做罢.回来后想想, 要是有个在线的C#IDE就好了.于是上网查了下相关的资料, 整出来个简单的在线C#IDE.
做这个,主要要解决两个问题, 一是如果将网页上文本框的代码编译并执行;二是如果将程序运行结果在网页上输出.
第一个问题不难, .NET已经有现成的C#编译类CSharpCodeProvider(或是其它语言的),再使用CompilerParameters类做为编译参数,就可以很容易的实现.
第二个问题, 举最简单情况, 就是将Console.Write方法输出的内容在网页上显示出来.这其实也很好办,只要在编译之前, 在输出语句做一个替换, 将输出的内容存到另一个地方.等运行结束后, 再从那个地方取出来就是了.  阅读全文
posted @ 2008-05-05 20:56 xiaosonl 阅读(2054) | 评论 (27)编辑

2008年5月4日

     摘要: 我们在写程序当中, 经常需要检验数据是否符合规则, 比如不能为空, 必需为Email或手机格式等.于是, 在我们的代码中, 就会出现很多重复的诸如此类的校验代码.然后我就想到, 用Attribute的方式, 为需要校验的对象属性加上规则, 再用统一的方法去获取并校验数据是否符合规则.Attribute的定义如下:Code highlighting produced by Actipro CodeH... 阅读全文
posted @ 2008-05-04 00:04 xiaosonl 阅读(1769) | 评论 (4)编辑

2008年5月2日

     摘要: 这是FastDev.Core程序集中的一个类Converters, 用于数据类型转换.使用方法: Converters.ChangeType<T>(toChangeObject) 或 toChangeObject.ChangeType<T>() 测试如下:Code highlighting produced by Actipro CodeHighlighter (freew... 阅读全文
posted @ 2008-05-02 23:58 xiaosonl 阅读(1493) | 评论 (4)编辑

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
posted @ 2008-05-01 21:53 xiaosonl 阅读(432) | 评论 (1)编辑
想想还是有空就写写博客算了.
posted @ 2008-05-01 21:10 xiaosonl 阅读(21) | 评论 (0)编辑

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


posted @ 2007-06-25 17:12 xiaosonl 阅读(386) | 评论 (0)编辑

2007年5月21日

前一两周公司要做网站,分析之后决定使用NBear做为ORM工具.于是开始学习NBear,在学习和使用过程中,越来越发现NBear给开发带来的便利.
现在把自己整理的学习资料发布上来与大家共享(其实就是Teedy的BLOG的离线版的......).

Teddy是个挺热心的人,有问题他都会尽快的给予解答.在这里赞一个.

NBear资料.rar
posted @ 2007-05-21 09:44 xiaosonl 阅读(562) | 评论 (0)编辑

导航

<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

与我联系

搜索

 

常用链接

留言簿

我参与的团队

我的标签

随笔分类

随笔档案

文章分类

相册

推荐博客

最新评论

阅读排行榜

评论排行榜