一步步到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();
    }
}
posted @ 2019-09-20 18:30  见风任然是风  阅读(263)  评论(0编辑  收藏  举报