Entity Famework 的通過IOC注入實現,fameworkioc
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() > 0;
}
}
///// <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("11111");
}else
{
Console.WriteLine("22222");
}
Console.ReadLine();
}
}
}
ConsoleApplication1
5、測試結果: 就是成功啦,感覺也沒啥好說的,只是現在有這麼一個思路,估計各位大神早就已經用到這些了,希望各位大神不吝賜教,我最近還在愁架構的組成呢。
6、架構的滿足條件
1、能配置不同的數據庫 例如 oracle、sqlserver、db2。只要通過配置或者不麻煩的修改就可以變更
2、數據庫與代碼分離(這不就是現在orm的思想嘛,可是我們還在用存儲過程呢)
3、支持存儲過程
4、需要支持緩存
5、支持百萬級數據、千量的並發
6、基於框架的二次開發簡便
7、語言是c# (不然我看不懂啊)
有滿足以上條件的框架請大神推薦啊~~ 現暫定是用spring.net+Nhibernate+MVC
以上的代碼下載地址: 點擊