什么是依赖注入 IoC

设计原则:依赖注入原则

依赖倒置原则,是一种程序设计模式的原则

高层模块不应该依赖底层模块,二者都应该依赖其抽象。

抽象不应该依赖细节,细节应该依赖抽象。依赖导致原则很好的体现了“面向接口编程”的思想。

Ioc容器是由依赖注入框架提供的,它是依赖注入框架中最主要的东西,它主要用来映射依赖管理对象创建和生存周期。

高耦合例子

这里是一个爸爸给孩子讲故事的例子,都是通过new来实例化类

复制代码
 class Program
    {
        static void Main(string[] args)
        {
            Father father = new Father();
            father.Read();
        }
    }

    public class Book
    {
        public string GetContent()
        {
            return "很久很久以前,有个人叫盘古";
        }
     }

    public class Father
    {
        public void Read()
        {
            Book book = new Book();
            Console.WriteLine("爸爸开始讲故事了");
            Console.WriteLine(book.GetContent());
        }
    }
复制代码

突然有一天,孩子不想听故事了,想听报纸上的内容。这里有需要添加一个报纸类

复制代码
  class Program
    {
        static void Main(string[] args)
        {
            Father father = new Father();
            father.Read();
        }
    }

    public class Book
    {
        public string GetContent()
        {
            return "很久很久以前,有个人叫盘古";
        }
     }

    public class paper
    {
        public string GetContent()
        {
            return "报纸内容。。。。";
        }
    }

    public class Father
    {
        public void Read()
        {
            //Book book = new Book();
            //Console.WriteLine("爸爸开始讲故事了");
            //Console.WriteLine(book.GetContent());

            paper paper = new paper();
            Console.WriteLine("爸爸开始读报纸了");
            Console.WriteLine(paper.GetContent());
        }
    }
复制代码

 

这里发现 Father 被修改了,突然有一天小孩又想听看网页上的新闻。。。这里Father内容是不是又要修改了呢? 那肯定是的,这样Father会不断的被修改,耦合度太高,导致代码被频繁修改。这里能不能解耦呢?哎,那就用接口吧,降低耦合。来定义个接口

    public interface IReader
    {
        string GetContent();
    }

解耦例子

让 Book和paper 继承 IReader

复制代码
 class Program
    {
        static void Main(string[] args)
        {
            //先来读书
            Father father = new Father(new Book());
            father.Read();
        }
    }

    public interface IReader
    {
        string GetContent();
    }

    public class Book:IReader
    {
        public string GetContent()
        {
            return "很久很久以前,有个人叫盘古";
        }
     }

    public class Paper : IReader
    {
        public string GetContent()
        {
            return "报纸内容。。。。";
        }
    }

    public class Father
    {

        public IReader Reader { get; set; }
        //通过构造函数实例化接口
        public Father(IReader reader) {
            Reader = reader;
        }
        public void Read()
        {
            //Book book = new Book();
            //Console.WriteLine("爸爸开始讲故事了");
            //Console.WriteLine(book.GetContent());

            //paper paper = new paper();
            //Console.WriteLine("爸爸开始读报纸了");
            //Console.WriteLine(paper.GetContent());

            Console.WriteLine("爸爸开始了。。");
            Console.WriteLine(Reader.GetContent());

        }
    }
复制代码

 

 

 在换一下Paper

 static void Main(string[] args)
  {
            //先来读书
            Father father = new Father(new Paper());
            father.Read();
  }

 

 

 这样就实现了解耦。不用频繁修复Father,而是在调用的时候,随便调用。

 

posted @   幽冥狂_七  阅读(1456)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示