OSharp框架总体设计
OSharp框架解说系列(1):总体设计
〇、前言
哈,距离前一个系列《MVC实用构架设计》的烂尾篇(2013年9月1日)已经跨了两个年头了,今天是2015年1月9日,日期已经相映,让我们开启新的航程吧。
前一个系列讲的主要是我对架构设计的理解以及怎样用好EntityFramework的一些想法,在技术细节上并没有太多的考究。不幸的是,不少同学把这个架构当作框架来用了,里边留的很多坑,坑苦了很多人,真是误人子弟,深表愧疚。于是重新整理代码,整理思路,鼓捣出了这个我们将要详解的开源框架:OSharp。这次,我们真的深入地说框架了,而不是架构那样只是蜻蜓点水。
关于OSharp:OSharp是我在“MVC EF 技术交流群”(5008599)发起的一个群内开源项目。项目名字来源也挺有意思,在头脑风暴起名时谁说的一句“O-Shit”,后来结合CSharp,演化成了OSharp。当时40多个群成员集资购买阿里云服务器作为TFS的服务器,本想以TFS为团队合作平台进行合力开发的,但后面由于组织不力,合作得并不是很理想,基本上不了了之。不过大家的热情还是深深的激励着我坚持按原来的想法把底层基本做成型了。于是便有了现在这个开源项目,一个架构上,兼容上来说很初级的框架。
OSharp是一个依赖于EntityFramework,专注于业务数据模型与EntityFramework解耦的适用于中小型项目开发的(插件式)框架。OSharp将支持基于OSGi.NET的插件式开发,但我们还是会从非插件式讲起,详细了解OSharp开发框架的方方面面。在本系列中,将会讲解到不少非常实用的技术与编码技巧,欢迎关注。
本系列使用的开发环境为:Windows7 SP1、Visual Studio 2013、Sql Server 2012,.NET Framework 4.5,github.com 代码托管,并使用 Resharper 8.0.2 进行代码优化。
一、目录
〇、前言
一、目录
二、架构图
三、架构说明
四、开源说明
二、架构图
三、架构说明
(一)使用技术(库)说明
- 技术框架:.NET Framework 4.5
- 数据存储:EntityFramework 6
- 数据序列化:使用JSON.NET作为JSON序列化的主要工具
- 数据映射:AutoMapper,主要用于数据传输对象DTO与数据实体模型Model之间的相互转化,免于繁杂的对象属性赋值
- IoC组件:Autofac,定义了一个专用于处理映射的空接口IDependency,用于处理IoC接口与实现的批量映射,避免Autofac与各个层次耦合
- 日志记录:定义通用日志记录接口与基础API,日志输出方式可以使用现成的任意日志组件(如log4net)
- 缓存处理:未定
- 。。。
(二)项目工程详解
- 通用工具组件:OSharp.Utility
说明:分类封装通用的与技术无关的辅助工具类功能
依赖项:JSON.NET - Web组件:OSharp.Web
说明:封装Web相关的Webform,MVC,WebApi,SignalR等Web技术的辅助功能
依赖项:1.OSharp.Utility,2.ASP.NET MVC,3.ASP.NET WebApi,4.SignalR,5.JSON.NET - OSharp框架核心组件:OSharp.Core
说明:1.定义OSharp框架的核心API,是整个框架运行的骨架
2.该骨架提供数据存储,缓存,权限等模块的基础接口或基类,不提供具体实现
3.业务层依赖于此层的接口与基类进行业务操作,而不依赖于具体的实现
4.日志API为了使用方便,已经迁移到OSharp.Utility
依赖项:OSharp.Utility - EntityFramework数据存储组件:OSharp.Core.Data.Entity
说明:1.提供OSharp.Core中定义的数据存储功能的EntityFramework的实现方案
2.本框架的数据组件将不做各个ORM的兼容性处理,为充分发挥EntityFramework的性能优化,本框架将强依赖于EntityFramework
依赖项:1.OSharp.Utility,2.OSharp.Core,3.EntityFramework,4.AutoMapper - 普通(非插件式)示例工程:OSharp.Demo.Web
说明:1.为尽量简化项目结构,本工程不采用类库划分层次,而采用文件夹分层方式
2.各文件夹说明如下:
2.1 Models:用于EntityFramework数据存储操作的数据实体模型,与数据库中的表对应
2.2 EntityConfigurations:数据实体与数据库的映射类,实体将依靠这些映射类加载到与业务解耦的上下文中,并使用 Fluent API 配置数据映射的细节
2.3 Dtos:DTO是业务层的输入信息,Controller与业务层之间通信数据的承载体,用户的交互数据将以“DTO+简单类型数据”的形式传递到业务层中进行处理,DTO与Model之间的映射使用AutoMapper来进行,以减少繁杂的属性赋值操作和增加代码的可维护性
2.4 Services:业务契约,业务实现将以模块为划分,而不是以实体为划分。以模块为划分单元,可增强业务操作的内聚性,但为了方便处理各个实体的业务,推荐使用 局部类(partial)的方式来组织实现层的代码
四、开源说明
(一)github.com
OSharp项目已在github.com上开源,地址为:https://github.com/i66soft/osharp,欢迎阅读代码,欢迎 Fork,如果您认同 OSharp 项目的思想,欢迎参与 OSharp 项目的开发。
在Visual Studio 2013中,可直接获取 OSharp 的最新源代码,获取方式如下,地址为:https://github.com/i66soft/osharp.git
(二)nuget
OSharp的相关类库已经发布到nuget上,欢迎试用,直接在nuget上搜索 “osharp” 关键字即可找到
系列导航
- 【开源】OSharp框架解说系列(1):总体设计
OSharp框架总体设计的更多相关文章
- 【开源】OSharp框架解说系列(1):总体设计及系列导航
系列文章导航 [开源]OSharp框架解说系列(1):总体设计 [开源]OSharp框架解说系列(2.1):EasyUI的后台界面搭建及极致重构 [开源]OSharp框架解说系列(2.2):EasyU ...
- 【开源】OSharp框架解说系列(5.1):EntityFramework数据层设计
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- 【开源】OSharp框架解说系列(6.1):日志系统设计
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- 【开源】OSharp框架解说系列(5.2):EntityFramework数据层实现
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- 【开源】OSharp框架解说系列(4):架构分层及IoC
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- 【开源】OSharp框架解说系列(3):扩展方法
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- 【开源】OSharp框架解说系列(2.2):EasyUI复杂布局及数据操作
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- 【开源】OSharp框架解说系列(2.1):EasyUI的后台界面搭建及极致重构
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- NET权限系统开源项目
http://www.cnblogs.com/yubaolee/p/OpenAuth.html http://www.cnblogs.com/guozili/p/3496265.html Sereni ...
随机推荐
- 很牛逼的android真机调试,手机、平板、电视都可
1.首先通过路由器,搭建局域网 2.手机开wifi,记住ip地址,平板开wifi,记住ip地址,电视开wifi,记住ip 3.然后再eclipse里面“窗口-首选项-android-ddms里面设置使 ...
- out ref区别
1.使用ref型参数时,传入的参数必须先被初始化.对out而言,必须在方法中对其完成初始化. 2.out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候. ...
- java新手笔记31 集合实现类
Person类: package com.yfs.javase; import java.util.Date; public class Person implements Comparable { ...
- 【leetcode】8. String to Integer (atoi)
题目描述: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input ...
- Mysql 数据库安装配置
MySQL的多种安装方法 在当今的互联网企业,Mysql数据服务几乎都是运行在LINUX系统操作系统上,当然你也可以在WINDOWS.UNIX等商业操作系统上运行. 但是一般企业都会采用LNMP.LA ...
- html的3要素
在HTML标记语言中可以将每个网页源码分成3部分: 1.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" &q ...
- KnockoutJS(3)-绑定语法
绑定语法大致分为2种: 1. 数据绑定(data-bind syntax) 2. 绑定上下文(Binding Context) 下面针对这2中绑定语法分别介绍一下 1. 绑定上下文(Binding C ...
- OWIN OAuth 2.0 Authorization Server
http://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server The assumption ...
- 如何使用Git——(一)
一.git与github git 是一款自由和开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目. github 是一个网站,给用户提供git仓库托管服务,是开源代码库以及版本控制系统.在 ...
- linux实现nginx按照日期存储日志
通过shell脚本实现+定时任务+nginx信号管理实现日志按日期存储. 1.编写shell脚本,实现日志按日期存储 #!/bin/bash base_path='/home/wwwlogs/' lo ...