shuai's profile娱乐精神PhotosBlog Tools Help

Blog


    9/23/2008

    基于Linq的通用业务层


    最近研究了一下Linq
    做了一个通用业务层

    本人把数据访问层去掉了
    首先因为我的目标是快速开发
    不考虑性能和功能性
    另外Linq在我眼中就是数据访问层
    --在业务层写直接Linq已经足够简单单清晰

    先看一下怎么使用
    实现三层结构,只需要两步,只需写一行代码
    1。用CodeSmith,或SqlMetal,或VS O/R Designer根据数据结构生成实体类
    生成内容例如:
        [Table(Name = "ApplicationForm")]
        public partial class ApplicationForm
        {
            [Column(Name = "Id", IsPrimaryKey = true, IsDbGenerated = true)]
            public int Id { get; set; }

            [Column(Name = "Name")]
            public string Name { get; set; }
        }

    2。业务层继承我的Service<>泛型类
    形如:
        public class ApplicationFormService : Service<ApplicationForm>
        {

        }


    就这么简单
    Service<>的子类将提供了常用的CRUD,Count,Exist操作
    并支持较复杂的强类型的查询条件

    功能举例
    1。查询
    (强类型的查询条件)
        //按ID返回单个对象
        ApplicationForm list6 = ApplicationFormService.FindById(10);

        //返回单个对象。强类型的查询条件
        ApplicationForm list5 = ApplicationFormService.Find(p => p.IsInMarket == true && p.Course == 0);

        //返回多个对象,单个条件
        List<ApplicationForm> list1 = ApplicationFormService.FindAll(p => p.Id == 1);

        //返回多个对象,多个条件
        List<ApplicationForm> list2 = ApplicationFormService.FindAll(p => p.IsInMarket == true && p.Course == 0);

        //拼装查询条件
        Criteria<ApplicationForm> criteria3 = new Criteria<ApplicationForm>();
        criteria3.And(p => p.IsInMarket == true);
        if (couse != "")
            criteria3.And(p => p.Course == 0);            //查询条件
        criteria3.LimitNumber = 2;                        //返回个数
        criteria4.AddOrderBy(p => p.Course);            //排序
        criteria4.AddOrderByDescending(p => p.Id);        //第二排序字段降序
        List<ApplicationForm> list4 = ApplicationFormService.FindAll(criteria4);

        //分页
        int totalCount;
        List<ApplicationForm> list7 = ApplicationFormService.FindAll(0, 5, out totalCount);        //0表示startIndex
        List<ApplicationForm> list8 = ApplicationFormService.FindAll(p => p.IsInMarket == true, 5, 5, out totalCount);

    2。创建
        ApplicationForm entity = new ApplicationForm();
        entity.Name = "";
        ApplicationFormService.Create(entity);


    3。更新
        在这里Linq有个让我不爽的地方,就是不能指定只针对某一个对象更新
        entity.Name = "abc";
        ApplicationFormService.Update();


    4。删除
        ApplicationFormService.DeleteById(100);
        ApplicationFormService.Delete(x => x.Id == 100 && x.Name == "abc");

    5。Count 和 Exist
        ApplicationFormService.Count();
        ApplicationFormService.Count(x => x.Name == "abc");
        bool isExist = ApplicationFormService.Exist(x => x.Id == 100 && x.Name == "abc");


    当然如果对Service<>产生的方法不满意你也可以重写这些方法
    Service<>内部提供了DataContext,可以处理对数据库的操作

    为了增加扩展性Service<>类提供了几个版本
    Service<TEntity, TIdentiry, TOrderKeySelector>
    TEntity表示实体类型
    TIdentiry表示主键类型
    TOrderKeySelector表示自定义默认排序字段

    好了先写到这里
    下一篇我将写一个处理对象关联情况的文章