欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一步步到IOC

程序员文章站 2022-07-02 13:18:25
一段代码 问题 依赖具体Log4NetServices,要换成FileLogServices就要改 依赖 依赖就是 变形: 这样在实际使用中,不用管ILogServices的实现,由Shop的构造函数负责给具体实现 问题 Shop本身也不知道是用Log4NetServices还是FileLogSer ......

一段代码

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