手寫IOC

須要瞭解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;
        }

    }
}

 

接下來就是使用IOC容器了

在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就好了

 

 語言及其匱乏,沒有過多的解釋啊,我真的下班了

相關文章
相關標籤/搜索