手写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类
在这里插入图片描述

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

在IDAL中创建IUserDAL接口

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();
}

在这里插入图片描述

到这里基本的框架就已经搭建完了,接下来开始写c#教程容器了
在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;
}  

在这里插入图片描述

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

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

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

在这里插入图片描述

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值