-
手写IOC
需要了解ioc是什么的可以看看这位大佬的分享
https://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html
我这里创建的项目是.net web api的项目,因为个人不太擅长前端,所以没创MVC,然后是一个三层架构的,先看一下代码结构吧
一,项目结构
1.Extension是一个扩展的类库,这里主要是用来存一个读取JSON文件的类
2.Reflex是一个第三方的类库,用来给对象与对象之前做联系的
3.IOC的核心就是低耦合,既然要降低耦合就得依赖抽象,不能依赖细节
所以在DAL里面引用IDAL,BLL里面引用IBLL和IDAL,
Container的话除了Extension和IDAL全部引用
二,代码
首先,在Model中创建一个User类
1
2
3
|
public string ID { get ; set ; } public string Name { get ; set ; } public string Pwd { get ; set ; } |
在IDAL中创建IUserDAL接口
1
|
User GetUser(); |
在DAL中创建UserDAL类,实现IUserDAl接口,然后给个简单的模拟数据
1
2
3
4
5
6
|
return new User() { ID = "01" , Name = "张思瑞" , Pwd = "0044" }; |
在IBLL中创建IUserBLL接口
1
|
User GetUser(); |
在BLL中创建UserBLL类,实现IUserBLL接口,然后注入一个IUserDAL接口
1
2
3
4
5
6
7
8
9
|
private IUserDAL _userDAL; UserBLL(IUserDAL userDAL) { _userDAL = userDAL; } public User GetUser() { return _userDAL.GetUser(); } |
到这里基本的框架就已经搭建完了,接下来开始写容器了
在Extension中创建一个GetJson类,用来读取Json文件的数据,需要引用nuget 包 Newtonsoft.Js
Reflex中创建ObjectFactory类,因为太长了就不截图了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
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文件
1
2
3
4
5
|
//注册类 //“DAL”是程序集的名称 “DAL.UserDAL”是程序集的名称加上类名 //中间用逗号隔开 "IUserDAL" : "DAL,DAL.UserDAL" , "IUserBLL" : "BLL,BLL.UserBLL" |
创建一个web api控制器
1
2
3
4
5
6
7
8
9
|
IUserBLL _userBLL; UserController() { _userBLL = ObjectFactory.CreateBll<IUserBLL>( "IUserBLL" ); } public string GetUser() { return _userBLL.GetUser().Name; } |
接下来应该可以调试了,让我们运行起来看一下
好了,报错了,索引超出界限,让我看看是什么原因,我要下班了,明天再来更新
好了,改完了,因为我们那个UserBLL里面的构造函数我们没有设置成公共的,所以我们第三方检测不到,加上public就行了
语言及其匮乏,没有过多的解释啊,我真的下班了
出处:https://www.cnblogs.com/issirui/p/14442345.html