• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Asp.NetCore内置IOC容器的理解

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

01.使用IOC容器的好处

  • 对接口和实现类由原来的零散式管理,到现在的集中式管理。
  • 对类和接口之间的关系,有多种注入模式(构造函数注入、属性注入等)。
  • 对实现类的声明周期进行了统一管理(创建、释放、和监控)。
  • 对类的依赖有编译时到运行时。

02.实际使用

1.创建控制台项目并添加Nuget包引用
Nuget包:Microsoft.Extensions.DependencyInjection
2.简单使用

class Program
{
    static void Main(string[] args)
    {

        // 正常使用
        Bird bird = new Bird(); //IFly bird=new Bird();
        bird.Fly();
         
        //IOC使用
        ServiceCollection serviceCollection = new ServiceCollection();  //创建IOC容器
        serviceCollection.AddTransient<IFly, Bird>();                   //将服务注入容器
        var provider = serviceCollection.BuildServiceProvider();        //创建Provider
        var fly = provider.GetService<IFly>();                          //获取注入的类型
        fly.Fly();                                                      //调用
    }
}

interface IFly
{
    void Fly();
}

class Bird : IFly
{
    public void Fly()
    {
        Console.WriteLine("鸟飞起来了........");
    }
}

3.日志注册

  • NetGut包:Microsoft.Extensions.Logging.Console
class Program
{
    static void Main(string[] args)
    {
        ServiceCollection serviceCollection = new ServiceCollection();
        //注册日志服务
        serviceCollection.AddLogging(configure => 
            configure.AddConsole() 
            );
        serviceCollection.AddTransient<IFly, Bird>();
        var provider = serviceCollection.BuildServiceProvider();
        provider.GetService<ILoggerFactory>();
        var fly = provider.GetService<IFly>(); 
        fly.Fly();

    }
}

interface IFly
{
    void Fly();
}

class Bird : IFly
{
    private readonly ILogger<Bird> _iLogger;
    public Bird(ILoggerFactory logger)
    { 
        _iLogger = logger.CreateLogger<Bird>(); 
    }
    public void Fly()
    {
        _iLogger.Log(LogLevel.Information, "日志消息.....");
        Console.WriteLine("鸟飞起来了........");
    }
}

4.生命周期

  • AddTransient 每次请求都会被创建
  • AddSingleton 单例模式
  • AddScoped 作用域(范围)内是单例模式

AddScoped案例代码

class Program
{
    static void Main(string[] args)
    {
        ServiceCollection serviceCollection = new ServiceCollection();
        ////每次请求都创建
        //serviceCollection.AddTransient<IFly, Bird>();
        ////单例模式,永远都是一个
        //serviceCollection.AddSingleton<IFly, Bird>();
        //在某个作用域下是单例
        serviceCollection.AddScoped<IFly, Bird>();
         
        var provider = serviceCollection.BuildServiceProvider();
        //创建两个scope
        var scope1 = provider.CreateScope();
        var scope2 = provider.CreateScope();
        //第一个作用域
        scope1.ServiceProvider.GetService<IFly>();
        //第二个作用域
        scope2.ServiceProvider.GetService<IFly>();
        //第三个作用域 注意:这里是获取了两次
        var fly = provider.GetService<IFly>();//第一次
        fly = provider.GetService<IFly>();//第二次
        fly.Fly(); 
    }
}

interface IFly
{
    void Fly();
}

class Bird : IFly
{

    public Bird()
    {
        Console.WriteLine("初始化构造函数......");
    }
    public void Fly()
    {
        Console.WriteLine("鸟飞起来了........");
    }
}

运行结果:调用了三次构造函数....


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ASP.NET MVC4 部分视图发布时间:2022-07-10
下一篇:
ASP.NET访问网络驱动器(映射磁盘)发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap