.net5 IOC原理+手动创建IOC容器

.net5 IOC原理+手动创建IOC容器

IOC容器 说白了就是创建对象的(看成创建对象的一个工厂)

而在**.net5以及.net core** 项目中自带容器(IserviceCollection
也可以用更强大的第三方容器Autofac

下面来实现一下简单制作一个容器

手动建立IOC容器

原理:就是通过反射+特性的方式来创建对象
代码案例

创建个容器抽象

public  interface ICustomeContainer
    {
        //注册
        void RegisterType<TFrom, TTo>(CustomeLifetime lifetime = CustomeLifetime.Transient) where TTo : TFrom;

        //创建
        T Resolve<T>();
    }

创建对应的实现

  public class CustomeContainer : ICustomeContainer
    {
        /// <summary>
        /// 定义参数字典
        /// </summary>
        private Dictionary<string, RegisterInfo> ContainerDicationary = new Dictionary<string, RegisterInfo>();

        /// <summary>
        /// 添加服务
        /// </summary>
        /// <typeparam name="TFrom"></typeparam>
        /// <typeparam name="TTo"></typeparam>
        /// <param name="lifetime"></param>
        public void RegisterType<TFrom, TTo>(CustomeLifetime lifetime = CustomeLifetime.Transient) where TTo : TFrom
        {
            ContainerDicationary.Add(typeof(TFrom).FullName, new RegisterInfo()
            {
                TargetType = typeof(TTo),
                LifeTime = lifetime
            });
        }

        /// <summary>
        /// 创建对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public T Resolve<T>()
        {
            //反射创建对象
            string abstartName = typeof(T).FullName;//得到程序集+类名
            RegisterInfo registerInfo = ContainerDicationary[abstartName];//根据类型从字典得到RegisterInfo对象
            Type type = registerInfo.TargetType;//反射
            T result = default(T);
            result = (T)this.ObjectInstance(type);
            return result;
        }
        private object ObjectInstance(Type type)
        {         
                ConstructorInfo  ctor = type.GetConstructors().OrderByDescending(c => c.GetParameters().Length).First();    
            object oInstance = Activator.CreateInstance(type);//调用无参构造
            return oInstance;

        }
    }

生命周期枚举

  public enum CustomeLifetime
    {
        /// <summary>
        /// 瞬时
        /// </summary>
        Transient,
        /// <summary>
        /// 单例
        /// </summary>
        Singleton,
        /// <summary>
        /// 作用域
        /// </summary>
        Scope
    }

对象实体

  public class RegisterInfo
    {
        /// <summary>
        /// 目标类型
        /// </summary>
        public Type TargetType { get; set; }
        /// <summary>
        /// 生命周期
        /// </summary>
        public CustomeLifetime LifeTime { get; set; }
    }

最后再创建业务接口和实现

 public interface IService
    {
        void Login();
    }
 class Service : IService
    {
        public Service()
        {
            Console.WriteLine("Service被构造");
        }
        public void Login()
        {
            Console.WriteLine("这是Service的登录方法!!");
        }
    }

Program调用创建对象

  ICustomeContainer container = new CustomeContainer();//创建容器 
            container.RegisterType<IService, Service>();
            IService service = container.Resolve<IService>();//获取对象的实例
            service.Login();                                               //

都是这么几个路数,
创建容器
把服务和实现放进容器
生命周期申明
获取对象

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小盆友你是否很有多问号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值