zoukankan      html  css  js  c++  java
  • 我的开发框架(WinForm)2

    我的开发框架(WinForm)2

    上篇文章简单的介绍了一下,我的一个开发框架。看的人还不少,多谢大家的关注,我继续介绍一下,模块和模块之间是怎么组织起来的。

    Data模块:

    该模块主要完成对数据的操作,采用仓储模式实现,在核心模块(Core.Data)中定义操作接口和基础类. 主要的接口有IRepository,IUnitOfWork,IDbCnnFactory。

    所有的数据库操作都是针对实体进行的,一个实体在数据库中对应一个比,目前为了简化操作,不考虑实体关联的操作。这样更加容易理解,更容易上手。

    一、接口的定义

    1、IRepository接口,最基本、最重要的接口。通过它完成实体类的增删改查的操作。

     
    
    
    IRepository
    /// <summary>
       /// Interface IRepository
       /// </summary>
       /// <typeparam name="T">业务实体</typeparam>
       /// <typeparam name="Tid">业务实体的主键类型</typeparam>
       public interface IRepository<T, Tid> where T : EntityBase<Tid>, new()
       {
           /// <summary>
           /// 添加数据
           /// </summary>
           /// <param name="entity">The entity.</param>
           void Add(T entity);
    
           /// <summary>
           /// 批量添加数据
           /// </summary>
           /// <param name="entities">The entities.</param>
           void Add(IEnumerable<T> entities);
    
           /// <summary>
           /// 更新数据
           /// </summary>
           /// <param name="entity">The entity.</param>
           void Update(T entity);
    
           /// <summary>
           /// 批量更新数据
           /// </summary>
           /// <param name="entities">The entities.</param>
           void Update(IEnumerable<T> entities);
    
           /// <summary>
           /// Delete item
           /// </summary>
           /// <param name="entity">The entity.</param>
           void Delete(T entity);
    
           /// <summary>
           /// 批量删除数据
           /// </summary>
           /// <param name="entities">The entities.</param>
           void Delete(IEnumerable<T> entities);
    
           /// <summary>
           /// 根据主键删除数据
           /// </summary>
           /// <param name="id">The id.</param>
           void DeleteByID(object id);
    
           /// <summary>
           /// 删除符合条件的实体
           /// </summary>
           /// <param name="filter"></param>
           void Delete(Expression<Func<T, bool>> filter);
    
           /// <summary>
           /// 根据主键批量删除数据
           /// </summary>
           /// <param name="ids">The ids.</param>
           void DeleteByIDs(IEnumerable<Tid> ids);
           /// <summary>
           /// 通过ID读取数据
           /// </summary>
           /// <param name="id">The id.</param>
           /// <returns>`0.</returns>
           T GetEntityByID(object id);
    
           /// <summary>
           /// 获得符合条件的第一个实体
           /// </summary>
           /// <param name="filter"></param>
           T GetEntity(Expression<Func<T, bool>> filter);
    
           /// <summary>
           /// 开始一个工作单元
           /// </summary>
           /// <returns>IUnitOfWork.</returns>
           IUnitOfWork OpenUnitOfWork();
    
           /// <summary>
           /// 读取全部数据
           /// </summary>
           /// <returns>List of selected elements</returns>
           IEnumerable<T> GetEntities();
    
    
           /// <summary>
           /// 根据过滤条件读取数据
           /// </summary>
           /// <param name="filter">过滤条件</param>
           /// <returns>List of selected elements</returns>
           IEnumerable<T> GetEntities(Expression<Func<T, bool>> filter);
    
           /// <summary>
           /// 根据过滤条件和排序条件读取数据
           /// </summary>
           /// <typeparam name="S"></typeparam>
           /// <param name="filter">过滤条件</param>
           /// <param name="orderByExpression">排序条件</param>
           /// <param name="ascending">是否为正序</param>
           /// <returns>IEnumerable{`0}.</returns>
           IEnumerable<T> GetEntities<S>(Expression<Func<T, bool>> filter,
               Expression<Func<T, S>> orderByExpression, bool ascending = true);
    
           /// <summary>
           /// 分页读取数据
           /// </summary>
           /// <param name="pageIndex">页号</param>
           /// <param name="pageSize">每页大小</param>
           /// <returns>List of selected elements</returns>
           PageResult<T> GetPagedEntities(int pageIndex, int pageSize);
    
           /// <summary>
           /// 分页读取数据
           /// </summary>
           /// <param name="filter">过滤条件</param>
           /// <param name="pageIndex">页号</param>
           /// <param name="pageSize">每页大小</param>
           /// <returns>List of selected elements</returns>
           PageResult<T> GetPagedEntities(Expression<Func<T, bool>> filter, int pageIndex, int pageSize);
    
           /// <summary>
           /// 分页读取数据
           /// </summary>
           /// <typeparam name="S"></typeparam>
           /// <param name="filter">过滤条件</param>
           /// <param name="orderByExpression">排序条件</param>
           /// <param name="ascending">是否正序</param>
           /// <param name="pageIndex">页号</param>
           /// <param name="pageSize">每页大小</param>
           /// <returns>List of selected elements</returns>
           PageResult<T> GetPagedEntities<S>(Expression<Func<T, bool>> filter, Expression<Func<T, S>> orderByExpression, bool ascending, int pageIndex, int pageSize);
    
           /// <summary>
           /// 分页读取数据
           /// </summary>
           /// <param name="filter">sql过滤条件</param>
           /// <param name="pageIndex">页号</param>
           /// <param name="pageSize">每页大小</param>
           /// <returns>PageResult{`0}.</returns>
           PageResult<T> GetPagedEntities(string filter, int pageIndex, int pageSize);
    
           /// <summary>
           /// 分页读取数据
           /// </summary>
           /// <param name="filter">sql过滤条件</param>
           /// <param name="orderby">sql排序字段</param>
           /// <param name="pageIndex">页号</param>
           /// <param name="pageSize">每页大小</param>
           /// <returns>PageResult{`0}.</returns>
           PageResult<T> GetPagedEntities(string filter, string orderby, int pageIndex, int pageSize);
    
       }
    2、其中实体类必须继承EntityBase<Tid>或 EntityBase 类,TId 是指ID的类型,每个实体必须有个主键Id,

    Data.Oracle是针对Oracle数据库的一个实现。

    image

    Repository类实现了一下接口一个是默认ID类型的,一个是可自定义ID类型的.

    public class Repository<TEntity, Tid> : IRepository<TEntity, id>,IStatRepository<TEntity,Tid>,ISqlRepository 
    where TEntity : EntityBase<Tid>, new()
     
    public class Repository<TEntity> : Repository<TEntity, Guid>, IRepository<TEntity>, IStatRepository<TEntity>
     where TEntity : EntityBase, new()
       

    OracleDbCnnFactory 实现就比较简单了,和写ADO.Net一样.唯一注意的就是增加了MEF的导出标签

     [Export(typeof(IDbCnnFactory))] ,MEF的使用,园子里有很多好的文章,我就不班门弄斧了

    三、接口的使用

         比如我设计了一个菜单类,属性主要有显示的标题、关键字、序号等。

    //获得菜单类操作的Repository
       var rep = ApplicationEx.Container.GetRepository<MenuInfo>();
       //查询所有可用的菜单,并排序
    var ens=  rep.GetEntities(t => t.Enable == true).OrderBy(t=>t.PIndex);
    返回的是 IEnumerable<MenuInfo>
     
    关于ApplicationEx类,我们后面会介绍到。
    通过以上这些接口,我相信90%的数据库操作,都能满足。如果你的系统对性能要求比较高的话,我建议直接写sql+ADO.Net写,执行效率会更好,也好优化。
    我这样设计也考虑到Web程序的应用,毕竟程序能在web、手机上实现的都会移植过去,单机的项目会越来越少。
     
     
    分类: .Net
  • 相关阅读:
    多线程频繁上锁同步还不如用单线程
    1分钟左右随机生成2000万行随机字符串
    语言:抽象,封装,底层,低级
    构建WDK驱动出现fatal error U1087: cannot have : and :: dependents for same target
    Cmake编译成静态库
    VMware虚拟机相关文件问题
    输出流重定向
    How can I let the compiled script depend on something dynamic
    应用服务攻击工具clusterd
    Kali Linux缺少ifconfig命令
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3286184.html
Copyright © 2011-2022 走看看