Entity Famework 的通过IOC注入实现
1、 前言
最近刚换了一家公司,由于之前的公司代码并没有用到项目框架,需要我整理下NHibernate与Entity Framework之间的区别及适用性。并写出相关的示例代码
面试的时候吹的牛,得把他填上啊。
刚刚整完相应的EF code first的示例代码,需要连接oracle,那个数据库迁移整的我不要不要的,最后还没搞出来。对于EF 调用oralce的存储过程,也没有搞出来。
有这方面资料的园友,请告知啊。
2、思路
先把基于DBcontext的类,进行继承,创建出基于Tclass的base类,创建出基于T的操作方法。好吧,我也讲不明白了,大神求教。然后所有的方法调用,通过IOC进行注入
3、准备条件
VS2013、oracle11g
4、代码
OracleDBContext类继承与DBContext
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Xml.Linq;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Migrations;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Migrations.History;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; namespace DALClass
{
public class OracleDBContext : DbContext
{ //public DbSet<CAT> cat { get; set; } //public DbSet<FOOD> food { get; set; } public OracleDBContext()
: base("OracleDbContext")
{
Database.SetInitializer<OracleDBContext>(null);
} public OracleDBContext(string connString)
: base(connString)
{
Database.SetInitializer<OracleDBContext>(null);
}
public override string ToString()
{
return base.ToString();
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("CNBLOGS");
}
}
}
OracleDBContext
OracleDbSetBase<T>继承与OracleDBContext
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Xml.Linq;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Migrations;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Migrations.History;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; namespace DALClass
{
public class OracleDbSetBase<T> : OracleDBContext where T : class
{
public OracleDbSetBase(string connString) : // 数据库链接字符串
base(connString)
{
Database.SetInitializer<OracleDbSetBase<T>>(null);//设置为空,防止自动检查和生成
} public DbSet<T> Entities { get; set; }
}
}
OracleDbSetBase
IOracleDbDAL 数据库操作方法接口(暂时只定义一个方法,方便大家看)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Linq.Expressions; namespace CommonClass
{
public interface IOracleDbDAL
{ bool Add<T>(T entity,string connstring) where T:class; //bool Update<T>(T entity) where T : class; //bool Delete<T>(T entity) where T : class; }
}
IOracleDbDAL
OracleDbDAL 类 基于IOracleDbDAL
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Xml.Linq;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Migrations;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Migrations.History;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq.Expressions;
using CommonClass; namespace DALClass
{
public class OracleDbDAL :IOracleDbDAL
{ //public string connstring { get; set; } ////public OracleDbDAL()
////{
//// this.connstring = "OracleDbContext";
////}
//public OracleDbDAL(string connString)
//{
// this.connstring = connString;
//} #region
public bool Add<T>(T entity,string connstring) where T : class
{
using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
{
db.Entry<T>(entity).State = EntityState.Added;
return db.SaveChanges() > ;
}
}
///// <summary>
///// 修改
///// </summary>
///// <param name="entity">实体</param>
///// <returns>返回受影响行数</returns>
//public bool Update<T>(T entity) where T : class
//{
// using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
// {
// db.Set<T>().Attach(entity);
// db.Entry<T>(entity).State = EntityState.Modified;
// return db.SaveChanges() > 0;
// }
//} ///// <summary>
///// 删除
///// </summary>
///// <param name="entity">实体</param>
///// <returns>返回受影响行数</returns>
//public bool Delete<T>(T entity) where T : class
//{
// using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
// {
// db.Set<T>().Attach(entity);
// db.Entry<T>(entity).State = EntityState.Deleted;
// return db.SaveChanges() > 0;
// }
//} ///// <summary>
///// 根据条件删除
///// </summary>
///// <param name="deleWhere">删除条件</param>
///// <returns>返回受影响行数</returns>
//public bool DeleteByConditon<T>(Expression<Func<T, bool>> deleWhere) where T : class
//{
// using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
// {
// List<T> entitys = db.Set<T>().Where(deleWhere).ToList();
// entitys.ForEach(m => db.Entry<T>(m).State = EntityState.Deleted);
// return db.SaveChanges() > 0;
// }
//} ///// <summary>
///// 查找单个
///// </summary>
///// <param name="id">主键</param>
///// <returns></returns>
//public T GetSingleById<T>(int id) where T : class
//{
// using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
// {
// return db.Set<T>().Find(id);
// }
//} ///// <summary>
///// 查找单个
///// </summary>
///// <param name="seleWhere">查询条件</param>
///// <returns></returns>
//public T GetSingle<T>(Expression<Func<T, bool>> seleWhere) where T : class
//{
// using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
// {
// return db.Set<T>().FirstOrDefault(seleWhere);
// }
//} ///// <summary>
///// 获取所有实体集合
///// </summary>
///// <returns></returns>
//public List<T> GetAll<T>() where T : class
//{
// using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
// {
// return db.Set<T>().ToList<T>();
// }
//} ///// <summary>
///// 获取所有实体集合(单个排序)
///// </summary>
///// <returns></returns>
//public List<T> GetAll<T, Tkey>(Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class
//{
// using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
// {
// return CommonSort(db.Set<T>(), orderWhere, isDesc).ToList<T>();
// }
//} ///// <summary>
///// 单个排序通用方法
///// </summary>
///// <typeparam name="Tkey">排序字段</typeparam>
///// <param name="data">要排序的数据</param>
///// <param name="orderWhere">排序条件</param>
///// <param name="isDesc">是否倒序</param>
///// <returns>排序后的集合</returns>
//public IQueryable<T> CommonSort<T, Tkey>(IQueryable<T> data, Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class
//{
// if (isDesc)
// {
// return data.OrderByDescending(orderWhere);
// }
// else
// {
// return data.OrderBy(orderWhere);
// }
//} ///// <summary>
///// 根据条件查询实体集合
///// </summary>
///// <param name="seleWhere">查询条件 lambel表达式</param>
///// <returns></returns>
//public List<T> GetList<T>(Expression<Func<T, bool>> seleWhere) where T : class
//{
// using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
// {
// return db.Set<T>().Where(seleWhere).ToList();
// }
//} ///// <summary>
///// 根据条件查询实体集合(单个字段排序)
///// </summary>
///// <param name="seleWhere">查询条件 lambel表达式</param>
///// <returns></returns>
//public List<T> GetList<T, Tkey>(Expression<Func<T, bool>> seleWhere, Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class
//{
// using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
// {
// return CommonSort(db.Set<T>().Where(seleWhere), orderWhere, isDesc).ToList();
// }
//} ///// <summary>
///// 获取分页集合(无条件无排序)
///// </summary>
///// <returns></returns>
//public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, out int totalcount) where T : class
//{
// using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
// {
// totalcount = db.Set<T>().Count();//获取总数
// //需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
// return db.Set<T>().Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
// }
//} ///// <summary>
///// 获取分页集合(无条件单个排序)
///// </summary>
///// <returns></returns>
//public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, Tkey>> orderWhere, bool isDesc, out int totalcount) where T : class
//{
// using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
// {
// totalcount = db.Set<T>().Count();//获取总数
// //需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
// return CommonSort(db.Set<T>(), orderWhere, isDesc).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
// }
//} ///// <summary>
///// 获取分页集合(有条件无排序)
///// </summary>
///// <returns></returns>
//public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, bool>> seleWhere, out int totalcount) where T : class
//{
// using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
// {
// totalcount = db.Set<T>().Where(seleWhere).Count();//获取总数
// //需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
// return db.Set<T>().Where(seleWhere).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
// }
//} ///// <summary>
///// 获取分页集合(有条件单个排序)
///// </summary>
///// <returns></returns>
//public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, bool>> seleWhere,
// Expression<Func<T, Tkey>> orderWhere, bool isDesc, out int totalcount) where T : class
//{
// using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
// {
// totalcount = db.Set<T>().Where(seleWhere).Count();//获取总数
// //需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
// return CommonSort(db.Set<T>().Where(seleWhere), orderWhere, isDesc).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
// }
//} //#endregion //#region 原始sql操作
///// <summary>
///// 执行操作
///// </summary>
///// <param name="sql"></param>
///// <param name="paras"></param>
//public void ExecuteSql(string sql, params object[] paras)
//{
// using (OracleDBContext db = new OracleDBContext(connstring))
// {
// db.Database.ExecuteSqlCommand(sql, paras);
// }
//} ///// <summary>
///// 查询列表
///// </summary>
///// <typeparam name="T"></typeparam>
///// <param name="sql"></param>
///// <param name="paras"></param>
///// <returns></returns>
//public List<T> QueryList<T>(string sql, params object[] paras) where T : class
//{
// using (OracleDBContext db = new OracleDBContext(connstring))
// {
// return db.Database.SqlQuery<T>(sql, paras).ToList();
// }
//} ///// <summary>
///// 查询单个
///// </summary>
///// <typeparam name="T"></typeparam>
///// <param name="sql"></param>
///// <param name="paras"></param>
///// <returns></returns>
//public T QuerySingle<T>(string sql, params object[] paras) where T : class
//{
// using (OracleDbSetBase<T> db = new OracleDbSetBase<T>(connstring))
// {
// return db.Database.SqlQuery<T>(sql, paras).FirstOrDefault();
// }
//} ///// <summary>
///// 执行事务
///// </summary>
///// <param name="lsSql"></param>
///// <param name="lsParas"></param>
//public void ExecuteTransaction(List<String> lsSql, List<Object[]> lsParas)
//{
// using (OracleDBContext db = new OracleDBContext(connstring))
// {
// using (var tran = db.Database.BeginTransaction())
// {
// try
// {
// for (int i = 0; i < lsSql.Count; i++)
// {
// if (lsParas != null && lsParas.Count > 0)
// {
// db.Database.ExecuteSqlCommand(lsSql[i], lsParas[i]);
// }
// }
// foreach (String item in lsSql)
// {
// db.Database.ExecuteSqlCommand(item);
// } // tran.Commit();
// }
// catch (Exception ex)
// {
// tran.Rollback();
// throw ex;
// }
// }
// }
//}
//#endregion //#region 通用属性
///// <summary>
///// 获取数据库服务器当前时间。
///// </summary>
//public DateTime ServerTime
//{
// get
// {
// using (OracleDBContext db = new OracleDBContext(connstring))
// {
// String sql = "SELECT GETDATE()";
// Object objServerTime = db.Database.SqlQuery<Object>(sql);
// return Convert.ToDateTime(objServerTime);
// }
// }
//} ///// <summary>
///// 获取数据库版本。
///// </summary>
//public String DatabaseVersion
//{
// get
// {
// using (OracleDBContext db = new OracleDBContext(connstring))
// {
// try
// {
// String sql = "SELECT Version FROM Sys_Version";
// Object objServerTime = db.Database.SqlQuery<Object>(sql);
// return Convert.ToString(objServerTime);
// }
// catch
// {
// }
// return String.Empty;
// }
// }
//}
#endregion
}
}
OracleDbDAL
Ioc类(该用的是Unity)
using Microsoft.Practices.Unity; namespace CommonClass
{
public class Ioc
{
private static readonly UnityContainer _container; static Ioc()
{
_container = new UnityContainer();
} public static void Register<TInterface, TImplementation>() where TImplementation : TInterface
{ _container.RegisterType<TInterface, TImplementation>();
} public static void Register<TInterface, TImplementation>(TImplementation t) where TImplementation : TInterface
{
_container.RegisterInstance(t.GetType(), t);
}
//public static void Register<TInterface, TImplementation>(string conn) where TImplementation : TInterface
//{
// _container.RegisterType<TInterface, TImplementation>(new TImplementation(conn));
//} public static T Get<T>()
{
return _container.Resolve<T>();
} }
}
Ioc
接下来是进行实现了,通过注入IOC来进行数据添加
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using CommonClass;
using ModelClass;
using DALClass; namespace FacadeClass
{
public class Class1
{
public bool AAA(FOOD INFO,string connstring)
{ Ioc.Register<IOracleDbDAL, OracleDbDAL>();
var service = Ioc.Get<IOracleDbDAL>();
return service.Add(INFO, connstring);
} }
}
Facade
最后是页面的的调用展示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using ModelClass;
using DALClass;
using FacadeClass; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string connstring = "OracleDbContext";
FOOD entity = new FOOD();
entity.ID = Guid.NewGuid().ToString();
entity.CODE = "M0005";
entity.FOOTTYPE = "猫粮la5";
entity.SUPPLIER = "非洲的5";
entity.NAME = "喵吃粮食5"; FacadeClass.Class1 c = new FacadeClass.Class1(); if(c.AAA(entity, connstring))
{
Console.WriteLine("");
}else
{
Console.WriteLine("");
}
Console.ReadLine();
}
}
}
ConsoleApplication1
5、测试结果: 就是成功啦,感觉也没啥好说的,只是现在有这么一个思路,估计各位大神早就已经用到这些了,希望各位大神不吝赐教,我最近还在愁架构的组成呢。
6、架构的满足条件
1、能配置不同的数据库 例如 oracle、sqlserver、db2。只要通过配置或者不麻烦的修改就可以变更
2、数据库与代码分离(这不就是现在orm的思想嘛,可是我们还在用存储过程呢)
3、支持存储过程
4、需要支持缓存
5、支持百万级数据、千量的并发
6、基于框架的二次开发简便
7、语言是c# (不然我看不懂啊)
有满足以上条件的框架请大神推荐啊~~ 现暂定是用spring.net+Nhibernate+MVC(但是这个ORM相对于查询效率上来说,还是会比较慢。所以运行效率更高的框架)
以上的代码下载地址: 点击
Entity Famework 的通过IOC注入实现的更多相关文章
- 使用JAVA实现的一个简单IOC注入实例
https://blog.csdn.net/echoshinian100/article/details/77977823 欲登高而望远,勿筑台于流沙 RSS订阅 原 使用JAVA实现的一个简单IOC ...
- Fortify漏洞之XML External Entity Injection(XML实体注入)
继续对Fortify的漏洞进行总结,本篇主要针对 XML External Entity Injection(XML实体注入) 的漏洞进行总结,如下: 1.1.产生原因: XML External ...
- Spring第四天,BeanPostProcessor源码分析,彻底搞懂IOC注入及注解优先级问题!
- 关于Container容器以及IoC注入机制的认识
container 容器的概念: 1 container 是一个Java 所编写的程序,用于对象之间之间管理对象关系. 主要的java EE 容器如下: Java容器类包含List.ArrayList ...
- Spring IOC 注入方式
依赖注入通常有如下两种方式: ①设值注入:IOC容器使用属性的Setter方法来注入被依赖的实例. 设值注入是指IOC容器使用属性的Setter方法来注入被依赖的实例.这种注入方式简单.直观,因而在S ...
- Unity IOC注入详细配置(MVC,WebApi)
一直想写一篇关于unity 详细的配置信息的文章,也算是自我总结吧 先介绍了unity , Unity是微软官方推荐使用的轻型的IOC框架,支持各种方式的注入 ,使用来解耦的利器. 获取unity 的 ...
- Spring IOC 注入方式详解 附代码
引言 Spring框架作为优秀的开源框架之一,深受各大Java开发者的追捧,相信对于大家来说并不陌生,Spring之所以这么流行,少不了他的两大核心技术IOC和IOP.我们这里重点讲述Spring框架 ...
- XXE(XML External Entity attack)XML外部实体注入攻击
导语 XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击.由于程序在解析输入的XML数据时,解析了攻击者 ...
- Spring学习总结(5)——IOC注入方式总结
一.构造注入 在类被实例化的时候,它的构造方法被调用并且只能调用一次.所以它被用于类的初始化操作.<constructor-arg>是<bean>标签的子标签.通过其<v ...
随机推荐
- xamarin UWP设置HUD加载功能
使用xamarin开发的时候经常用到加载HUD功能,就是我们常见的一个加载中的动作,Android 下使用 AndHUD , iOS 下使用 BTProgressHUD, 这两个在在 NuGet 上都 ...
- Atitit (Sketch Filter)素描滤镜的实现 图像处理 attilax总结
Atitit (Sketch Filter)素描滤镜的实现 图像处理 attilax总结 1.1. 素描滤镜的实现方法比较简单,这里我们直接写出算法过程如下:1 1.2. 颜色减淡COLOR_DO ...
- Atiti qq空间破解(3)------------gui图形化通用cli执行器atiuse
Atiti qq空间破解(3)------------gui图形化通用cli执行器atiuse 结构:::命令行+以及反馈log框1 cli_guiUI/index.htm1 /AtiPlatf_c ...
- fildder 使用方法汇总
作为网络开发人员,怎能不使用一些抓包工具呢?fildder是个不错的选择. 不过,一般情况下,我们往往使用浏览器自带的控制台的[网络]选项就可以达到查看数据的通信情况了,当然,一些浏览器不容易捕捉的事 ...
- 【管理心得之三十】"这事与我无关"
场景再现 ========================事因 ⇔ {一个农庄主在他的粮仓里放了一只老鼠夹.} 过程 ⇔ {老鼠发现了,跑去告诉母鸡} 母鸡:这和我有什么关系,我很同情你. ...
- React(二)实现双向数据流
<div id="app"></div> <script src="bower_components/react/react.min.js& ...
- 因为相同类型的其他实体已具有相同的主键值。在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 。。。
因为相同类型的其他实体已具有相同的主键值.在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified&quo ...
- Android入门(十七)Android多线程
原文链接:http://www.orlion.ga/670/ 一.在子线程中更新UI Android中不允许在子线程中更新UI,只能在主线程中更新,但是我们有时候必须在子线程中执行一些耗时的任务,然后 ...
- 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】
最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...
- 高拍仪拍照SDK开发(良田影像S300L|S500L)
高拍仪拍照SDK开发下载地址:点击下载 本SDK适用于:良田影像S300L|S500L 高拍仪如图: SDN开发包安装之后找到安装目录,如图: 大家找到各自需要的版本即可,需要注意的是如果需要上传图片 ...