邯郸学步

吾虽是一不知名的菜鸟,但,吾亦有一个从后台程序员成为一名小小架构师梦想,深知架构师不是想想就成的。

吾已工作过一阵子,吾妄想在真正毕业之后工作一年左右就能拿到那个数ten thousand的工资。勿喷!

我们成长的环境不同,也许有人一手栽培,也许只能一个人默默奋斗。不论怎样,

我们要先学会造轮子,但我只会造4个高质量的轮子。让我的车子稳健地跑起来!

深知实现这些规划,我必须要付出常人难以付出的努力!

这些东西,会了就是不值一提的东西,不会就是高大上。

更希望能给读者带来一些新的认识及知识。

各位大神,请点支持一下小弟。最后我会为看官上传源码+数据库。

陆续更新。更新到你会为止!!

上篇衔接

篇二中通过一个工厂造出一个线程内唯一的继承IDBContact的DBContact。

并通过一个另一个工厂造出一个线程内唯一的继承ObjextContext的ModelContainer写成DBContact的属性。

并把上下文的Savechange()封装到DBContact里面

让执行SQL在服务层中控制逻辑。当然去掉了仓储层的ModelContainer的Savechange()

并把每个仓储写成对应的属性。

目的:就是业务逻辑(这里叫服务层)只通过这个类来进行访问数据层(这里叫仓储层)。

①DBContact.cs

using LKBS.CommunicationPlatform.IDAL;
using System.Data.Objects;//上下文的命名空间
using LKBS.CommunicationPlatform.Factory;
using System.Data.SqlClient; namespace LKBS.CommunicationPlatform.DAL
{
public class DBContact : IDBContact
{ public ObjectContext currentEFContext { get; set; }
ISingleEFCntextFactory singleEFCntextFactory = new SingleEFCntextFactory();//SingleEFCntextFactory做到单一DBContact
public DBContact()
{
currentEFContext = singleEFCntextFactory.GetCurrentEFContext();//
} public int excuteSQL(string cmdText, SqlParameter[] parammeters)
{
return currentEFContext.ExecuteStoreCommand(cmdText, parammeters);
}
//在仓储层BaseRespository就不用savechang了,让其在服务层控制提交数据库
//放在服务层这就是业务逻辑,根据业务逻辑层的一个场景,简单说一个方法中可能用到多个表。最后执行保存。做到和数据库交互一次
public int saveChange()
{
return this.currentEFContext.SaveChanges();
}
public IUserInforRespository userinforResponsity { get; set; }
}
}

②IDBContact.cs

using System.Data.Objects;
using System.Data.SqlClient;//上下文在的空间 namespace LKBS.CommunicationPlatform.IDAL
{
public interface IDBContact
{
//接口中的属性要{}
ObjectContext currentEFContext { get; set; }
int excuteSQL(string cmdText, SqlParameter[] parammeters);
int saveChange();
IUserInforRespository userinforResponsity { get; set; }
//...多个其他表的仓储,在T4模板中加OK
}
}

重点查看

⑥BaseService.cs中的获得仓储层的实例的逻辑。

为了获得实例我们在我们在BaseService中写一个获得实例的抽象方法,

为了必须在自类继承并保证在子类④UserInforService必须实现此方法,我们把BaseService写成了一个抽象类。必须写成!

什么时候执行呢?当子类实例化的时候,会调用基类构造方法。所以我们在基类的构造函数中调用这个获得实例的抽象方法。

ok,说了这么一大通,其实就是对抽象类和抽象方法的实践运用。还有实践运用子类实例化会调用基类构造方法这点!

最后,这一大通就是一个循环。理解了就会这样觉得。这种方式实现了 子类掉基类 基类调子类的循环!

服务层的创建

在这个层搭建的过程中,我漏洞百出,木有public或者木有程序集引用或者木有using,接口对象掉不出实例接口中已经具备的方法,老是警告。

不能直接赋值非静态变量或者属性或者方法等,最终还是都解决了。最终的程序没有一个警告。全部通过。

框架搭的差不多了。数据库其实我已经建好,只是没发上来。

下篇我就要开始搭前台了。

这个过程中,就是一个成长的过程,我要记录下来。以后少出这样的错。即使出错,我会很快的改正。

③IUserInforService.cs

using LKBS.CommunicationPlatform.Model;

namespace LKBS.CommunicationPlatform.IBll
{
public interface IUserInforService : IBaseService<UserInfor>
{ }
}

④UserInforService.cs

using LKBS.CommunicationPlatform.IBll;
using LKBS.CommunicationPlatform.Model;
using LKBS.CommunicationPlatform.IDAL;
using LKBS.CommunicationPlatform.DAL; namespace LKBS.CommunicationPlatform.Bll
{
public class UserInforService:BaseService<UserInfor>, IUserInforService
{
public override void setCurrentRespository()
{//此时点不出父类的dbContact 因为这个字段没有public
this.currentRespository = this.dbContact.userinforResponsity;
}
}
}

⑤IBaseService.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace LKBS.CommunicationPlatform.IBll
{
public interface IBaseService<T>
{
bool AddEntity(T entity);
bool DeleteEntity(T entity);
bool UpdateEntity(T entity);
T SelectOneEntity(Func<T, bool> wherelamda);
IQueryable<T> SelectAllEntityList(Func<T, bool> wherelamda);
IQueryable<T> SelectPageEntityList<S>(Func<T, S> orderLamda, Func<T, bool> whereLamda, int pageIndex, int pageSize, bool isAsc, out int rowcount);
}
}

⑥BaseService.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using LKBS.CommunicationPlatform.Model;
using LKBS.CommunicationPlatform.IDAL;
using LKBS.CommunicationPlatform.DAL;
using LKBS.CommunicationPlatform.Factory;
using System.Data.Entity;
using System.Runtime.Remoting.Messaging; namespace LKBS.CommunicationPlatform.Bll
{
public abstract class BaseService<T> where T : class,new()
{
//未添加程序集:using;类木有public 都能找不能这个类
ISingleDBContactFactory singleDBContactFactory = new SingleDBContactFactory();
public IDBContact dbContact;
public BaseService()
{
dbContact = singleDBContactFactory.CreateDBCotactUseEF();
//获取当前的仓储实例 重点逻辑!!!!! 将此类写成抽象类,子类必须实现。
//子类实例化时候,调用基类狗狗函数 ,构造函数执行基类虚方法,基类虚方法有调用子类实现的方法。然后继续执行基类下面代码
//这个逻辑才是真正对面向对象的理解和抽象类的使用的精髓使用。!!
setCurrentRespository();
}
public abstract void setCurrentRespository();
//错误 2 类型“T”必须是引用类型才能用作泛型类型或方法
//忘记在类中加上where T:class,new()
public IBaseRespository<T> currentRespository; public bool AddEntity(T entity)
{
currentRespository.AddEntity(entity);
if (dbContact.saveChange() > ) //找不到saveChange,接口中没有此方法,但子类有0.0
{
return true;
}
else
{
return false;
} } public bool DeleteEntity(T entity)
{ currentRespository.DeleteEntity(entity); if (dbContact.saveChange()>)
{
return true;
}
else
{
return false;
} } public bool UpdateEntity(T entity)
{
currentRespository.UpdateEntity(entity);
if (dbContact.saveChange()>)
{
return true;
}
else
{
return false;
} }
/// <summary>
/// 单个实体
/// </summary>
/// <param name="wherelamda"></param>
/// <returns></returns>
public T SelectOneEntity(Func<T, bool> wherelamda)
{
return currentRespository.SelectOneEntity(wherelamda);
}
/// <summary>
/// 查询 整张表或者多个实体
/// </summary>
/// <returns></returns>
public IQueryable<T> SelectAllEntityList(Func<T, bool> wherelamda)
{
return currentRespository.SelectAllEntityList(wherelamda);
}
int rowcount = ;
//泛型方法 <S>就是约束参数的类型,传什么参数,“自动识别”<S>. 定义需要<S>,调用该方法可以省略 :因为传的参数就已确定<S>的类型
public IQueryable<T> SelectPageEntityList<S>(Func<T, S> orderLamda, Func<T, bool> whereLamda, int pageIndex, int pageSize, bool isAsc, out int rowcount)
{//非页数pageCount,是总行数
return currentRespository.SelectPageEntityList<S>(orderLamda,whereLamda, pageIndex, pageSize, isAsc, out rowcount);
}
} }

下篇衔接

数据库我已经建好,当然还有需要完善数据库的地方,毕竟需求的分析是要变化的。

最后我会发上来,现在不发,因为架构用不到数据库。最后看官亲自动动手调试的时候,我自会奉献上。这算是小小的“干货”吧。自勉

T4模板的使用,对数据库表的生成,完善和数据库表的全部映射。

下篇我就开始搭前台了。这个估计要几天才能搞定。

ASP.NET MVC系列 框架搭建(三)之服务层的搭建的更多相关文章

  1. ASP.NET MVC系列 框架搭建(二)之仓储层的优化

    大神勿喷,小神默默学. 会了就是不值一提的东西,不会就是绝对的高大上. 最后上传源码.希望能给读者带来一些新的认识及知识. 还没上过头条..各位大神,请点支持一下小弟. 陆续更新.更新到你会为止!! ...

  2. ASP.NET MVC系列 框架搭建(一)之仓储层的搭建

    大神勿喷,小神默默学. 会了就是不值一提的东西,不会就是绝对的高大上. 最后上传源码.希望能给读者带来一些新的认识及知识. 还没上过头条..各位大神,请点支持一下小弟. 陆续更新.更新到你会为止!! ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2 ...

  4. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) 前言:这篇博客开始我们便一步一步的来实现这 ...

  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(24)-权限组的设计和实现(附源码)(终结)

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

  6. ASP.NET MVC+EF框架+EasyUI实现权限管理系列

    http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...

  7. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明     ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据 ...

随机推荐

  1. IDE整理

    1.eclipse 下载地址:http://www.eclipse.org/downloads/     2.myeclipse 下载地址:http://www.myeclipseide.com/mo ...

  2. 操作JNI函数以及复杂对象传递

    转自:http://blog.csdn.net/qinjuning/article/details/7607214 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的j ...

  3. 十六进制数'\0x'和'\x'有什么区别?(转)

    区别不大,都是把数按16进制输出. \0x:当输出的数转换为16进制只有1位时,在前面补0,如 0a,其它情况按照实际情况输出. \x:按照输出数转换为16进制的实际位数输出. 此外,小写x和大写X也 ...

  4. java_final关键字的使用

    final : 最终.作为一个修饰符,1,可以修饰类,函数,变量.2,被final修饰的类不可以被继承.为了避免被继承,被子类复写功能.3,被final修饰的方法不可以被复写.4,被final修饰的变 ...

  5. Google地图接口API之地图控件集(五)

    1.默认控件集 当使用一个标准的google地图,它的控件默认设置如下: (1). Zoom-显示一个滑动条来控制map的Zoom级别,如下所示:

  6. Google地图接口API之地图事件(四)

    演示几个地图事件: 1. 点击标记缩放地图 仍然使用上一遍文章使用的英国伦敦的地图.点用户点击标记时实现缩放地图的功能(点击标记时绑定地图缩放事件). 代码如下: <html> <h ...

  7. 贪心 BestCoder Round #39 1001 Delete

    题目传送门 /* 贪心水题:找出出现次数>1的次数和res,如果要减去的比res小,那么总的不同的数字tot不会少: 否则再在tot里减去多余的即为答案 用set容器也可以做,思路一样 */ # ...

  8. html基本标签练习

    Alt  显示工具栏 f2修改文件名称 内联元素:<div>只占一行</div> 块级元素:<span></span> 以utf8无bom格式编码 安装 ...

  9. BZOJ3838 : [Pa2013]Raper

    将选取的$A$看成左括号,$B$看成右括号,那么答案是一个合法的括号序列. 那么只要重复取出$k$对价值最小的左右括号,保证每时每刻都是一个合法的括号序列即可. 将$($看成$1$,$)$看成$-1$ ...

  10. JavaScript初学者应注意的七个细节

    每种语言都有它特别的地方,对于JavaScript来说,使用var就可以声明任意类型的变量,这门脚本语言看起来很简单,然而想要写出优雅的代码却是需要不断积累经验的.本文利列举了JavaScript初学 ...