手写IOC

  • A+
所属分类:.NET技术
摘要

需要了解ioc是什么的可以看看这位大佬的分享https://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html

需要了解ioc是什么的可以看看这位大佬的分享

https://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html

我这里创建的项目是.net web api的项目,因为个人不太擅长前端,所以没创MVC,然后是一个三层架构的,先看一下代码结构吧

一,项目结构

手写IOC

 

 

1.Extension是一个扩展的类库,这里主要是用来存一个读取JSON文件的类

2.Reflex是一个第三方的类库,用来给对象与对象之前做联系的

3.IOC的核心就是低耦合,既然要降低耦合就得依赖抽象,不能依赖细节

所以在DAL里面引用IDAL,BLL里面引用IBLL和IDAL,

Container的话除了Extension和IDAL全部引用

二,代码

首先,在Model中创建一个User类

 public string ID { get; set; }  public string Name { get; set; }  public string Pwd { get; set; }

手写IOC

 

在IDAL中创建IUserDAL接口

 User GetUser();

 手写IOC

 

 

 在DAL中创建UserDAL类,实现IUserDAl接口,然后给个简单的模拟数据

return new User() {     ID = "01",     Name = "张思瑞",     Pwd = "0044" }; 

手写IOC

在IBLL中创建IUserBLL接口

User GetUser();

手写IOC

 

 

 在BLL中创建UserBLL类,实现IUserBLL接口,然后注入一个IUserDAL接口

private IUserDAL _userDAL; UserBLL(IUserDAL userDAL) {     _userDAL = userDAL; } public User GetUser() {     return  _userDAL.GetUser(); }

手写IOC

 

 

 到这里基本的框架就已经搭建完了,接下来开始写容器了

在Extension中创建一个GetJson类,用来读取Json文件的数据,需要引用nuget 包 Newtonsoft.Js

手写IOC

 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"

手写IOC

创建一个web api控制器

IUserBLL _userBLL; UserController() {   _userBLL = ObjectFactory.CreateBll<IUserBLL>("IUserBLL"); } public string GetUser() {   return _userBLL.GetUser().Name; }  

手写IOC

 

 

 

 

接下来应该可以调试了,让我们运行起来看一下

好了,报错了,索引超出界限,让我看看是什么原因,我要下班了,明天再来更新

 

好了,改完了,因为我们那个UserBLL里面的构造函数我们没有设置成公共的,所以我们第三方检测不到,加上public就行了

手写IOC

 

 语言及其匮乏,没有过多的解释啊,我真的下班了