整個項目基本部分搭建完畢以後以下sql
先在每個項目中引入ef數據庫
而後再UI層引入如下兩個文件autofac和Autofac.Mvc5api
建立一個 User.cs。裏面放幾個屬性 id、name、pwd。數組
public interface IBaseDAL<TEntity> where TEntity : class { #region 1.0 增 void Add(TEntity model); #endregion #region 2.0 刪 void Delete(TEntity model, bool isAddedDbContext); #endregion #region 3.0 改 void Edit(TEntity model, string[] propertyNames); #endregion #region 4.0 查 #region 4.0.1 根據條件查詢 List<TEntity> QueryWhere(Expression<Func<TEntity, bool>> where); #endregion #endregion #region 5.0 統一保存 /// <summary> /// 統一將EF容器對象中的全部代理類生成相應的sql語句發給db服務器執行 /// </summary> /// <returns></returns> int SaveChanges(); #endregion }
由於所建立的model只有一個user,因此IDAL層到此結束。服務器
public class DbContextFactory { //獲取當前EF上下文的惟一實例 public static DbContext GetCurrentThreadInstance() { DbContext obj = CallContext.GetData(typeof(DbContextFactory).FullName) as DbContext; if (obj == null) { obj = new DBContext(); CallContext.SetData(typeof(DbContextFactory).FullName, obj); } return obj; } }
public class BaseDAL<TEntity> : IBaseDAL<TEntity> where TEntity : class {//1.0 實例化EF上下文 DbContext db = DbContextFactory.GetCurrentThreadInstance(); //2.0 定義DbSet<T> 對象 public DbSet<TEntity> _dbset; //3.0 在構造函數的初始化_dbset public BaseDAL() { _dbset = db.Set<TEntity>(); } #region 1.0 增 public virtual void Add(TEntity model) { //1.0 參數合法性驗證 if (model == null) { throw new Exception("BaseRepository泛型類中,新增操做的實體不能爲空"); } //2.0 進行新增操做 _dbset.Add(model); } #endregion #region 2.0 刪 public virtual void Delete(TEntity model, bool isAddedDbContext) { //1.0 參數合法性驗證 if (model == null) { throw new Exception("BaseRepository泛型類中,刪除操做的實體不能爲空"); } //2.0 進行刪除邏輯處理 if (!isAddedDbContext) { _dbset.Attach(model); } _dbset.Remove(model); } #endregion #region 3.0 改 /// <summary> /// 編輯,約定model 是一個自定義的實體,沒有追加到EF容器中的 /// </summary> /// <param name="model"></param> public virtual void Edit(TEntity model, string[] propertyNames) { //0.0 關閉EF的實體屬性合法性檢查 db.Configuration.ValidateOnSaveEnabled = false; //1.0 參數合法性驗證 if (model == null) { throw new Exception("BaseRepository泛型類中,編輯操做的實體不能爲空"); } if (propertyNames == null || propertyNames.Length == 0) { throw new Exception("BaseRepository泛型類中,編輯操做的屬性數組必須至少有一個值"); } //2.0 將model追加到EF容器中的 DbEntityEntry entry = db.Entry(model); entry.State = EntityState.Unchanged; foreach (var item in propertyNames) { entry.Property(item).IsModified = true; } } #endregion #region 4.0 查 /// <summary> /// 帶條件查詢 /// </summary> /// <param name="where"></param> /// <returns></returns> public virtual List<TEntity> QueryWhere(Expression<Func<TEntity, bool>> where) { return _dbset.Where(where).ToList(); } #endregion #region 5.0 統一保存 /// <summary> /// 統一將EF容器對象中的全部代理類生成相應的sql語句發給db服務器執行 /// </summary> /// <returns></returns> public virtual int SaveChanges() { try { return db.SaveChanges(); } catch (Exception ex) { throw ex; } } #endregion }
public interface IBaseBLL<TEntity> where TEntity : class { #region 1.0 增 void Add(TEntity model); #endregion #region 2.0 刪 void Delete(TEntity model, bool isAddedDbContext); #endregion #region 3.0 改 /// <summary> /// 編輯,約定model 是一個自定義的實體,沒有追加到EF容器中的 /// </summary> /// <param name="model"></param> void Edit(TEntity model, string[] propertyNames); #endregion #region 4.0 查 /// <summary> /// 帶條件查詢 /// </summary> /// <param name="where"></param> /// <returns></returns> List<TEntity> QueryWhere(Expression<Func<TEntity, bool>> where); #endregion #region 5.0 統一保存 /// <summary> /// 統一將EF容器對象中的全部代理類生成相應的sql語句發給db服務器執行 /// </summary> /// <returns></returns> int SaveChanges(); #endregion }
public class BaseBLL<TEntity> : IBaseBLL<TEntity> where TEntity : class { protected IBaseDAL<TEntity> dal = null; #region 1.0 增 public virtual void Add(TEntity model) { dal.Add(model); } #endregion #region 2.0 刪 public virtual void Delete(TEntity model, bool isAddedDbContext) { dal.Delete(model, isAddedDbContext); } #endregion #region 3.0 改 /// <summary> /// 編輯,約定model 是一個自定義的實體,沒有追加到EF容器中的 /// </summary> /// <param name="model"></param> public virtual void Edit(TEntity model, string[] propertyNames) { dal.Edit(model, propertyNames); } #endregion #region 4.0 查 /// <summary> /// 帶條件查詢 /// </summary> /// <param name="where"></param> /// <returns></returns> public virtual List<TEntity> QueryWhere(Expression<Func<TEntity, bool>> where) { return dal.QueryWhere(where); } #endregion #region 5.0 統一保存 /// <summary> /// 統一將EF容器對象中的全部代理類生成相應的sql語句發給db服務器執行 /// </summary> /// <returns></returns> public virtual int SaveChanges() { return dal.SaveChanges(); } #endregion }
public class User_BLL : BaseBLL<User>, IUser_BLL { IUser_DAL dalSer; public User_BLL(IUser_DAL dalSer) { base.dal = dalSer; this.dalSer = dalSer; } }
至此,基礎部分創建完畢,接下來創建ui層內容mvc
代碼:框架
public class AutoFacConfig { /// <summary> /// 負責調用autofac框架實現業務邏輯層和數據倉儲層程序集中的類型對象的建立 /// 負責建立MVC控制器類的對象(調用控制器中的有參構造函數),接管DefaultControllerFactory的工做 /// </summary> public static void Register() { //實例化一個autofac的建立容器 var builder = new ContainerBuilder(); //告訴Autofac框架,未來要建立的控制器類存放在哪一個程序集 (IOCtsX.UI) Assembly controllerAss = Assembly.Load("IOCtsX.UI"); builder.RegisterControllers(controllerAss); //告訴autofac框架註冊數據倉儲層所在程序集中的全部類的對象實例 Assembly respAss = Assembly.Load("IOCtsX.IDAL"); //建立respAss中的全部類的instance以此類的實現接口存儲 builder.RegisterTypes(respAss.GetTypes()).AsImplementedInterfaces(); //告訴autofac框架註冊業務邏輯層所在程序集中的全部類的對象實例 Assembly serpAss = Assembly.Load("IOCtsX.BLL"); //建立serAss中的全部類的instance以此類的實現接口存儲 builder.RegisterTypes(serpAss.GetTypes()).AsImplementedInterfaces(); //建立一個Autofac的容器 var container = builder.Build(); //將MVC的控制器對象實例 交由autofac來建立 DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); } }
最後查看數據庫ide
【最後附上關於autofac的幾點疑惑】函數
1由於在ui層的App_Start下的AutoFacConfig.cs須要,因此ui層必須引用bll層和dal層,這和三層的理念有些差別。由於三層中ui層並不須要引入dal層。測試
【結尾說明,關於瞭解autofac花掉的時間說長也長說短也短。本來覺得在博客園、csdn上面找一找就能立刻獲得一個能夠運行的demo,可是不少博主都是按照本身的理解去寫,在博文中或多或少會掉一些內容,這些內容對於博主和一些大牛來講是能夠忽略不計的,所以博文只須要核心代碼就能夠,可是對於我這種萌新來講簡直是災難級別的,由於跟着博主敲打代碼過程當中時長由於缺點什麼而沒法運行,本身也不知道錯誤在哪。所以不得不敲到一半立馬換下一個。致使效率低下。因此在寫這個博文的過程當中。我儘可能將每個細節所有羅列出來,以避免像我這樣的小白看不懂。照着這個流程講代碼敲出來而且運行時沒什麼大問題的。由於我每敲完一處就寫一點。最後將代碼運行完畢,纔敢上傳。若是各位看官以爲有什麼問題能夠在下方留言】
【若是須要代碼能夠去此下載,固然懶人也須要一點付出(csdn 3積分)。博主但願你們儘可能多動手,多理解。不要像我以前同樣只須要demo從不看文章致使後來吃了許多虧】