TOP

一步步到IOC
2019-09-23 11:16:45 】 浏览:18
Tags:步步 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();
    }
}

一步步到IOC https://www.cppentry.com/bencandy.php?fid=106&id=262023

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C# 截取字符串方法总结 下一篇异步和多线程Thread