須要瞭解ioc是什麼的能夠看看這位大佬的分享html
https://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html前端
我這裏建立的項目是.net web api的項目,由於我的不太擅長前端,因此沒創MVC,而後是一個三層架構的,先看一下代碼結構吧web
1.Extension是一個擴展的類庫,這裏主要是用來存一個讀取JSON文件的類json
2.Reflex是一個第三方的類庫,用來給對象與對象以前作聯繫的api
3.IOC的核心就是低耦合,既然要下降耦合就得依賴抽象,不能依賴細節架構
因此在DAL裏面引用IDAL,BLL裏面引用IBLL和IDAL,框架
Container的話除了Extension和IDAL所有引用函數
首先,在Model中建立一個User類flex
public string ID { get; set; } public string Name { get; set; } public string Pwd { get; set; }
在IDAL中建立IUserDAL接口spa
User GetUser();
在DAL中建立UserDAL類,實現IUserDAl接口,而後給個簡單的模擬數據
return new User() { ID = "01", Name = "張思瑞", Pwd = "0044" };
在IBLL中建立IUserBLL接口
User GetUser();
在BLL中建立UserBLL類,實現IUserBLL接口,而後注入一個IUserDAL接口
private IUserDAL _userDAL; UserBLL(IUserDAL userDAL) { _userDAL = userDAL; } public User GetUser() { return _userDAL.GetUser(); }
在Extension中建立一個GetJson類,用來讀取Json文件的數據,須要引用nuget 包 Newtonsoft.Js
Reflex中建立ObjectFactory類,由於太長了就不截圖了
using Extension; using System; using System.Collections.Generic; using System.Reflection; using System.Web; namespace Reflex { public class ObjectFactory { private static string PathName = HttpContext.Current.Server.MapPath("~/Assembly.json"); public static T CreateBll<T>(string key) { return (T)CreateObject(key); } /// <summary> /// 建立類的實例 /// </summary> /// <param name="key"></param> /// <returns>遞歸</returns> public static object CreateObject(string key = null) { Type type = CreateClass(key); var ctor = type.GetConstructors(); #region 準備構造函數的參數 List<object> list = new List<object>(); foreach (var item in ctor[0].GetParameters()) { //Type typedal = item.ParameterType; //object tapaType = CreateObject(item.ParameterType.Name); list.Add(CreateObject(item.ParameterType.Name)); } #endregion return Activator.CreateInstance(type, list.ToArray()); } /// <summary> /// 獲取Type /// </summary> /// <param name="key"></param> /// <returns></returns> private static Type CreateClass(string key) { string AssemblyData = GetJson.Readjson(key, PathName); Assembly assembly = Assembly.Load(AssemblyData.Split(',')[0]); Type type = assembly.GetType(AssemblyData.Split(',')[1]); return type; } } }
在Container中添加一個叫Assembly的json文件
//註冊類 //「DAL」是程序集的名稱 「DAL.UserDAL」是程序集的名稱加上類名 //中間用逗號隔開 "IUserDAL": "DAL,DAL.UserDAL", "IUserBLL": "BLL,BLL.UserBLL"
建立一個web api控制器
IUserBLL _userBLL; UserController() { _userBLL = ObjectFactory.CreateBll<IUserBLL>("IUserBLL"); } public string GetUser() { return _userBLL.GetUser().Name; }
接下來應該能夠調試了,讓咱們運行起來看一下
好了,報錯了,索引超出界限,讓我看看是什麼緣由,我要下班了,明天再來更新
好了,改完了,由於咱們那個UserBLL裏面的構造函數咱們沒有設置成公共的,因此咱們第三方檢測不到,加上public就好了
語言及其匱乏,沒有過多的解釋啊,我真的下班了