TinyFrame升级之三:逻辑访问部分
在上一篇,我们打造了自己的数据访问部分,这篇,我们准备讲解如何打造逻辑访问部分。
在上一篇中,我们利用Repository模式构建了基于泛型的操作合集。由于这些操作的合集都是原子性的操作,也就是针对单表的操作,我们有必要为每个单表做增删改查操作,所以这里我们最好将泛型包装一下:
这里是IBook接口部分,它继承自IRepository接口,并承载了Book实体类
1: using TinyFrame.Data.DataRepository;
2: using TinyFrame.Data.DomainModel;
3:
4: namespace TinyFrame.Repository
5: {
6: public interface IBook:IRepository<Book>
7: {
8: }
9: }
这里是BookRepository实现部分,它继承自Repository<Book>和IBook接口:
1:
2: using TinyFrame.Data.DataRepository;
3: using TinyFrame.Data.DataContext;
4: using TinyFrame.Data.DomainModel;
5:
6: namespace TinyFrame.Repository
7: {
8: public class BookRepository:Repository<Book>,IBook
9: {
10: public BookRepository(IDbContext context)
11: : base(context)
12: {
13: this.context = context;
14: }
15:
16: private IDbContext context;
17: }
18: }
这样包装之后,在TinyFrame.Services中,我们就可以实现自己的业务逻辑了。
比如,对于存储的书籍来说,我们需要对其进行增删改查:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Linq.Expressions;
6: using TinyFrame.Data.DomainModel;
7:
8: namespace TinyFrame.Services
9: {
10: public interface IBookService
11: {
12: IList<BookPlace> GetAllPlaces();
13: BookPlace GetPlacesByBookID(int bookid);
14:
15: IList<BookType> GetAllTypes();
16: BookType GetTypesByBookID(int bookid);
17:
18: Book GetBook(int bookid);
19: IList<Book> GetAllBooks();
20: IList<Book> GetBooks(Expression<Func<Book,bool>> where);
21:
22: bool AddBook(Book book);
23: bool UpdateBook(Book book);
24: bool DeleteBook(Book book);
25: }
26: }
它的实现部分如下:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using TinyFrame.Data.DataUnitOfWork;
6: using TinyFrame.Repository;
7: using System.Linq.Expressions;
8: using TinyFrame.Data.DomainModel;
9:
10: namespace TinyFrame.Services
11: {
12: public class BookService:IBookService
13: {
14: public BookService(IUnitOfWork unitOfWork
15: , IBook bookRepository
16: , IBookType bookTypeRepository
17: , IBookPlace bookPlaceRepository
18: )
19: {
20: this.unitOfWork = unitOfWork;
21: this.bookRepository = bookRepository;
22: this.bookTypeRepository = bookTypeRepository;
23: this.bookPlaceRepository = bookPlaceRepository;
24: }
25:
26: private readonly IUnitOfWork unitOfWork;
27: private readonly IBook bookRepository;
28: private readonly IBookType bookTypeRepository;
29: private readonly IBookPlace bookPlaceRepository;
30:
31: public IList<BookPlace> GetAllPlaces()
32: {
33: return bookPlaceRepository.GetMany(m => m.ID >= 0).ToList();
34: }
35:
36: public BookPlace GetPlacesByBookID(int bookid)
37: {
38: int bookPlaceID = bookRepository.Get(m => m.ID == bookid).BookPlaceID;
39: return bookPlaceRepository.Get(m => m.ID == bookPlaceID);
40: }
41:
42: public IList<BookType> GetAllTypes()
43: {
44: return bookTypeRepository.GetMany(m => m.ID >= 0).ToList();
45: }
46:
47: public BookType GetTypesByBookID(int bookid)
48: {
49: int bookTypeID = bookRepository.Get(m => m.ID == bookid).BookTypeID;
50: return bookTypeRepository.Get(m => m.ID == bookTypeID);
51: }
52:
53: public Book GetBook(int bookid)
54: {
55: return bookRepository.Get(m=>m.ID==bookid);
56: }
57:
58: public IList<Book> GetAllBooks()
59: {
60: return bookRepository.GetMany(m => m.ID >= 0).ToList();
61: }
62:
63: public IList<Book> GetBooks(Expression<Func<Book, bool>> where)
64: {
65: return bookRepository.GetMany(where).ToList();
66: }
67:
68:
69: public bool AddBook(Book book)
70: {
71: try
72: {
73: bookRepository.Insert(book);
74: unitOfWork.Commit();
75: return true;
76: }
77: catch { return false; }
78: }
79:
80: public bool UpdateBook(Book book)
81: {
82: try
83: {
84: bookRepository.Update(book);
85: unitOfWork.Commit();
86: return true;
87: }
88: catch { return false; }
89: }
90:
91: public bool DeleteBook(Book book)
92: {
93: try
94: {
95: bookRepository.Delete(book);
96: unitOfWork.Commit();
97: return true;
98: }
99: catch { return false; }
100: }
101: }
102: }
通过上面的代码,我们就能够有效地控制逻辑部分,同时融合cache和log的话,基本上就可以随心所欲的控制了。
TinyFrame升级之三:逻辑访问部分的更多相关文章
- [原创].NET 分布式架构开发实战之三 数据访问深入一点的思考
原文:[原创].NET 分布式架构开发实战之三 数据访问深入一点的思考 .NET 分布式架构开发实战之三 数据访问深入一点的思考 前言:首先,感谢园子里的朋友对文章的支持,感谢大家,希望本系列的文章能 ...
- Android OTA 升级之三:生成recovery.img
Android OTA 升级之三:生成recovery.img 作者: 宋立新 Email:zjujoe@yahoo.com 前言 得到了ota升级包后,我们就可以用它来升级系统了.Android 手 ...
- centos7内核升级及curl访问https证书过期处理
centos7内核升级及curl访问https证书过期处理 先看下当前系统的linux内核版本 uname -r 3.10.0-229.el7.x86_64 升级步骤 1.rpm --import h ...
- TinyFrame升级之二:数据底层访问部分
在上一篇中,我列举了框架的整体结构,下面我们将一一说明: 首先需要说明的是TinyFrame.Data. 它主要用于处理数据库底层操作.包含EF CodeFirst,Repository,Unitof ...
- TinyFrame升级之八:实现简易插件化开发
本章主要讲解如何为框架新增插件化开发功能. 在.net 4.0中,我们可以在Application开始之前,通过PreApplicationStartMethod方法加载所需要的任何东西.那么今天我们 ...
- 【经验随笔】MYSQL表加锁升级导致数据库访问失败
背景:有一次定位问题发现,在同一个session连接中对MYSQL部分表加锁,导致其它未加锁的表不能访问. 用Spring管理MYSQL数据连接,在多线程访问数据库的情况下容易出问题.一个线程中对部分 ...
- TinyFrame升级之一:框架概览
由于之前的TinyFrame多于简单,并且只是说明原理,并无成型的框架出来,所以这次我把之前的知识进行了汇总,然后做出了这一版的TinyFrame框架. 整个框架的结构如下: TinyFrame.Da ...
- TinyFrame升级之四:IOC容器
在这个框架中,我们使用Autofac作为IOC容器,来实现控制反转,依赖注入的目的. 在程序加载的时候,我需要将系统中所有用到的接口与之对应的实现进行装载.由于用户交互部分是在TinyFrame.We ...
- TinyFrame升级之五:全局缓存的设计及实现
在任何框架中,缓存都是不可或缺的一部分,本框架亦然.在这个框架中,我们的缓存分为两部分:内存缓存和单次请求缓存.简单说来,就是一个使用微软提供的MemoryCache做扩展,并提供全局唯一实例:另一个 ...
随机推荐
- 适当使用enum做数据字典 ( .net c# winform csharp asp.net webform )
在一些应用中,通常会用到很多由一些常量来进行描述的状态数据,比如性别(男.女),审核(未审核.已审核)等.在数据库中一般用数字形式来存储,比如0.1等. 不好的做法 经常看到一些应用(ps:最近又看到 ...
- EMC Documentum DQL整理(二)
1.Get file extension SELECT dos_extension FROM dm_format WHERE name IN (SELECT a_content_type FROM d ...
- yii2 rbac权限控制详细操作步骤
作者:白狼 出处:http://www.manks.top/article/yii2_rbac_description本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 ...
- 【转】JAVA 8 日期/时间(Date Time)API指南
前言 本来想写下Java 8的日期/时间API,发现已经有篇不错的文章了,那就直接转载吧~ PS:主要内容没变,做了部分修改. 原文链接: journaldev 翻译: ImportNew.com - ...
- 基于Attribute的Web API路由设置
路由对于MVC应用程序来说都是至关重要的一个部门,不管是asp.net mvc或者Ruby on Rails(当然还有其它的,我只熟悉这两个:) ) asp.net mvc自带的路由配置是在Glob ...
- partproble在RHEL 6下无法更新分区信息
在RHEL5.x版本下面,在添加磁盘分区等操作后,一直使用partproble命令使内核重新读取分区表信息,从而不用重新启动.但是最近在RHEL 6(Red Hat Enterprise Linux ...
- T-SQL性能调整(一)--编译和重新编译
概念简介 我们平时所说的查询在SQLServer 中主要有两部分来实现: 编译查询,主要包括了五个环节(缓存查找.分析.代数化.优化.缓存新计划) 流程描述: 首先,在计划缓存中查找是否包含新的查询, ...
- JVM知识点
先发个链接到两位大牛的主页 http://rednaxelafx.iteye.com/ http://icyfenix.iteye.com/ 目录 1)概述 2)编译 3) ...
- 定义类Human,具有若干属性和功能;定义其子类Man、Woman; 在主类Test中分别创建子类、父类和上转型对象,并测试其特性。
package com.hanqi.test; public class Humen { private String speak; private String read; private Stri ...
- 烂泥:puppet添加带密码的用户
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 前一篇文章,我们介绍了有关puppet3.7的安装与配置,这篇文章我们再来介绍下如何利用puppet添加带密码的用户. 要通过puppet添加带密码的用 ...