zoukankan      html  css  js  c++  java
  • 一步步到IOC

    一段代码

    class Program
    {
        static void Main(string[] args)
        {
            var shop=new Shop();
            shop.Add();
            shop.Delete();
            Console.ReadKey();
        }
    }
    class Shop
    {
        readonly Log4NetServices _logServices;
    
        public Shop()
        {
            _logServices = new Log4NetServices();
        }
    
        public void Add()
        {
            _logServices.Write("增加商品");
        }
    
        public void Delete()
        {
            _logServices.Write("删除商品");
        }
    }
    

    问题

    • 依赖具体Log4NetServices,要换成FileLogServices就要改

    依赖

    依赖就是依赖抽象

    变形:

    readonly ILogServices _logServices;

    这样在实际使用中,不用管ILogServices的实现,由Shop的构造函数负责给具体实现

    问题

    • Shop本身也不知道是用Log4NetServices还是FileLogServices,但使用者肯定是知道的。

    注入

    注入就是将你需要的东西传给你,不用你自己new

    变形:

    class Program
    {
        static void Main(string[] args)
        {
            var shop=new Shop(new Log4NetServices());
            shop.Add();
            shop.Delete();
            shop=new Shop(new FileLogServices());
            shop.Add();
            shop.Delete();
            Console.ReadKey();
        }
    }
    class Shop
    {
        readonly ILogServices _logServices;
    
        public Shop(ILogServices logServices)
        {
            _logServices = logServices;
        }
    
        public void Add()
        {
            _logServices.Write("增加商品");
        }
    
        public void Delete()
        {
            _logServices.Write("删除商品");
        }
    }
    

    问题:

    • 需要的人多了,我一个个new?
    • 需要的种类多了,我一个个new?
    • 能不能把new的东西放一起,需要的人统一从里面拿。

    IOC

    dotnetcore 的ioc示例

    class Program
    {
        static void Main(string[] args)
        {
            var serviceCollection = new ServiceCollection();
            serviceCollection.AddSingleton<ILogServices, Log4NetServices>();
            var serviceProvider = serviceCollection.BuildServiceProvider();
            var logServices = serviceProvider.GetService<ILogServices>();
            var shop = new Shop(logServices);
            shop.Add();
            shop.Delete();
            Console.ReadKey();
        }
    }
    
  • 相关阅读:
    精选 TOP 面试题
    leecode100热题 HOT 100(2)
    leecode100热题 HOT 100
    leetcode题库
    LeetCode All in One 题目讲解汇总(持续更新中...)
    LVS负载均衡(LVS简介、三种工作模式、十种调度算法)
    Smart/400开发上手3: 练习实践
    Smart/400开发上手2: COBOL批处理程序处理过程
    Smart/400开发上手1:入门
    一步步Cobol 400上手自学入门教程06
  • 原文地址:https://www.cnblogs.com/sunven/p/11558861.html
Copyright © 2011-2022 走看看