依賴注入容器-- Autofac

目錄:

1、簡介html

2、如何使用框架

  2.一、基本使用ide

  2.二、接口使用函數

  2.三、 其餘注入性能

  2.四、 注入的生命週期ui


 

1、簡介

在上一篇文章中講到替換默認服務容器,咱們選擇了Autofacthis

Autofac---Autofac是一款IOC框架,比較於其餘的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很輕量級性能上很是高。spa

咱們在.Net Core 中替換了自帶的默認服務容器,選擇採用Autofac,那麼如何去使用它呢?code

2、如何使用htm

TestController控制器

public class TestController : Controller
    {
        private static Animals _animals;

         public IActionResult Index()
        {
            ViewBag.Animal = _animals.Cry();
            return View();
        }
    }

 

替換修改後的Startup.cs 中的ConfigureServices

 public IServiceProvider ConfigureServices (IServiceCollection services)
        {
            services.AddMvc();
            // Add other framework services
            // Add Autofac

            var containerBuilder = new ContainerBuilder();
                  

            containerBuilder.Populate(services);
            var container = containerBuilder.Build();
            return new AutofacServiceProvider(container);

        }

 

1.一、  基本使用

建立 Animals  類

public class Animals
    {
        public string Cry()
        {
            return "小狗,汪汪汪";
        }
}

 

ConfigureServices   中添加註冊

containerBuilder.RegisterType<Animals>();

 

TestController 控制器中添加構造函數

   public TestController(Animals animals)
        {
            _animals = animals;

        }

 

運行起來看下

 

 

1.二、  接口使用

建立IAnimals.cs

public interface IAnimals
    {
        string Cry();
    }

    public class DogCry : IAnimals
    {
        public string Cry()
        {
            return "小狗,汪汪汪";
        }
    }
    public class CatCry : IAnimals
    {
        public string Cry()
        {
            return "小貓,喵喵喵";
        }
    }

 

ConfigureServices   中添加註冊

containerBuilder.RegisterType<DogCry>().As<IAnimals>();

 

TestController 控制器中添加構造函數並修改_animals爲對應的類型

public TestController(IAnimals animals)
        {
            _animals = animals;
        }

 

運行起來

 

 

若是一個類型被屢次註冊,以最後一個註冊的爲準

ConfigureServices   中添加註冊

containerBuilder.RegisterType<DogCry>().As<IAnimals>();

containerBuilder.RegisterType<CatCry>().As<IAnimals>();

 

運行起來看下

 

 

1.三、  其餘注入

一、 自動裝配—從容器裏面選擇一個構造方法來建立對象

建立Cry類

public  class Cry
    {

        public   Cry()
        {
            voice= "小狗,汪汪汪";
        }

        public  Cry(string voices)
        {
            if (string.IsNullOrWhiteSpace(voices))
            {
                voice = "旺旺旺";

            }
            voice= $"小狗,{voices}";

        }

        public  Cry(string name, string voices):this(voices)
        {
            if (string.IsNullOrWhiteSpace(voices))
            {
                voice = "旺旺旺";
            }
            if (string.IsNullOrWhiteSpace(name))
            {
                voice = "柴犬";
            }
            voice= $"{name},{voices}";
        }
        public static  string voice { get; set; }
}

 

ConfigureServices   中添加註冊

containerBuilder.RegisterType<Cry>().UsingConstructor(typeof(string));

 

Autofac會默認從容器中選擇參數最多的構造函數,若是想要指定選擇的話能夠指定UsingConstructor

 

二、 實例化注入

仍是上面的Cry類

ConfigureServices   中添加註冊

var output = new Cry("叫聲叫聲");

containerBuilder.RegisterInstance(output).ExternallyOwned();

 

先對對象實例化而後註冊,ExternallyOwned--配置組件,使容器永遠不會處理實例。

修改Test控制器

public IActionResult Index()
        {
            ViewBag.Animal = Cry.voice;

            return View();
        }

 

 

 

1.四、  注入的生命週期

1 Transient暫時生存期)--暫時生存期服務是每次從服務容器進行請求時建立的。 這種生存期適合輕量級、 無狀態的服務。

2 Scoped範圍生存期)--範圍生存期服務是每一個客戶端請求鏈接時建立的一次實例

3 Singleton單例生存期)--單例生存期會在程序第一次請求是建立一次實例,不會變化的

咱們來利用生成guid來看一下三個的生命週期有什麼具體的不同

修改Test控制器

public class TestController : Controller
    {

        private static IGetTransient _getTransient;

        private static IGetScoped _getScoped;

        private static IGetSingleton _getSingleton;

 

        public TestController(IGetTransient getTransient, IGetScoped getScoped, IGetSingleton getSingleton)
        {
            _getTransient = getTransient;

            _getScoped = getScoped;

            _getSingleton = getSingleton;
        }

        public IActionResult Index()
        {
            ViewBag.getTransient = _getTransient.GuidItem();

            ViewBag.getScoped = _getScoped.GuidItem();

            ViewBag.getSingleton = _getSingleton.GuidItem();

            return View();
        }     

    }

 

修改Index.cshtml

  <div>
        <span>Transient:</span><span>@ViewBag.getTransient</span>
    </div>

    <div>
        <span>Scoped:</span><span>@ViewBag.getScoped</span>
    </div>

    <div>
        <span>Singleton:</span><span>@ViewBag.getSingleton</span>
    </div>

 

IGuid接口

   public interface IGuid
    {
        Guid GuidItem();
    }

 

    /// <summary>
    /// 暫存生存期
    /// </summary>
    public interface IGetTransient : IGuid
    {

    }

    /// <summary>
    /// 範圍生存期
    /// </summary>
    public interface IGetScoped : IGuid
    {

    }

    /// <summary>
    /// 單例生存期
    /// </summary>
    public interface IGetSingleton : IGuid
    { 

    }

 

GuidServiceBase

public class GuidServiceBase: IGuid
    {
        private readonly Guid _item;

         public GuidServiceBase()
        {
            _item = Guid.NewGuid();
        }

         public Guid GuidItem()
        {

            return _item;
        }
    }
    /// <summary>
    /// 暫存生存期
    /// </summary>
    public class GuidTransientService : GuidServiceBase, IGetTransient
    {
    }

    /// <summary>
    /// 範圍生存期
    /// </summary>
    public class GuidScopedService : GuidServiceBase, IGetScoped
    {
    }

    /// <summary>
    /// 單例生存期
    /// </summary>
    public class GuidSingletonService : GuidServiceBase, IGetSingleton
    {
    }

 

ConfigureServices   中添加註冊

  

containerBuilder.RegisterType<GuidTransientService>().As<IGetTransient>();

containerBuilder.RegisterType<GuidScopedService>().As<IGetScoped>().InstancePerLifetimeScope();

containerBuilder.RegisterType
<GuidSingletonService>().As<IGetSingleton>().SingleInstance();

 

 

 

運行起來發現Singleton單例生存期)沒有變化,僅產生了一個實例,可是Scoped範圍生存期) 變化的不同,按照理論來講應該刷新以後會變化,可是兩邊應該會是同樣的值。--(由於兩個頁面依然是獨立的,並非一次請求)。咱們換另外一種方式驗證這個

 

修改Test控制器新增Guid

  public IActionResult Guid()
        {
            return View();
        }

 

添加Guid.cshtml經過inject注入依賴

 

@{
    Layout = null;
}
@inject WebApplication3.IGetTransient TransientService
@inject WebApplication3.IGetScoped GuidScopedService
@inject WebApplication3.IGetSingleton GuidSingletonService
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Guid</title> </head> <body> <div class="row"> <div> <h2>GuidItem Shows</h2> <h3>TransientItem: @TransientService.GuidItem()</h3> <h3>ScopedItem: @GuidScopedService.GuidItem()</h3> <h3>SingletonItem: @GuidSingletonService.GuidItem()</h3> </div> </div> </body> </html>

 

修改Index.cshtml

 

@{
    ViewData["Title"] = "Index";
}

<h1>Index</h1>

@Html.Partial("Guid")

<h1>Guid</h1>

@Html.Partial("Guid")

 

運行而後打開兩個頁面

 

 

咱們再次徹底吻合的,暫時生命週期在每次使用的時候的Guid(實例)都是變化的,範圍生命週期在同一個請求範圍內Guid是不變化的,不一樣請求的Guid是會發生變化的。可是單例生命週期的Guid從程序開始就不會發生變化的。

相關文章
相關標籤/搜索