ASP.NET Core 依赖注入-集成 Autofac

ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式,这是一种在类及其依赖关系之间实现控制反转 (IoC) 的技术。

 

默认服务容器是 Microsoft.Extensions.DependencyInjection 。

内置的服务容器一般能满足简单的框架和部分消费者应用的需求。 建议使用内置容器,除非你需要的特定功能不受内置容器支持,例如:

属性注入

基于名称的注入

子容器

自定义生存期管理

对迟缓初始化的 Func<T> 支持

基于约定的注册

 

而大部分情况下,实际项目中往往是比较复杂的,所以可以使用其他第三方IOC容器,如Autofac;

Autofac 是.Net世界中最常用的依赖注入框架之一. 相比.Net Core标准的依赖注入库, 它提供了更多高级特性, 比如动态代理和属性注入.

优点: 

它是C#语言联系很紧密,也就是说C#里的很多编程方式都可以为Autofac使用,例如可以用Lambda表达式注册组件

较低的学习曲线,学习它非常的简单,只要你理解了IoC和DI的概念以及在何时需要使用它们

XML配置支持

自动装配

 

AutoFac的使用

1、项目中引用

 

 <PackageReference Include="Autofac" Version="4.9.1" />    <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.3.1" />

2、准备好类、接口

using System.Collections.Generic;
namespace AspNetCoreExample.Services{    public interface IValuesService    {        IEnumerable<string> FindAll();
        string Find(int id);    }}
using System.Collections.Generic;using Microsoft.Extensions.Logging;
namespace AspNetCoreExample.Services{    public class ValuesService : IValuesService    {        private readonly ILogger<ValuesService> _logger;
        public ValuesService(ILogger<ValuesService> logger)        {            _logger = logger;        }
        public IEnumerable<string> FindAll()        {            _logger.LogDebug("{method} called", nameof(FindAll));
            return new[] { "value1", "value2" };        }
        public string Find(int id)        {            _logger.LogDebug("{method} called with {id}", nameof(Find), id);
            return $"value{id}";        }    }}

3、替换掉内置的Ioc

using System;using System.Linq;using Autofac.Extensions.DependencyInjection;using Microsoft.AspNetCore;using Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;
namespace AspNetCoreExample{    public class Program    {        public static void Main(string[] args)        {            // The ConfigureServices call here allows for            // ConfigureContainer to be supported in Startup with            // a strongly-typed ContainerBuilder. If you don't            // have the call to AddAutofac here, you won't get            // ConfigureContainer support. This also automatically            // calls Populate to put services you register during            // ConfigureServices into Autofac.            var host = WebHost.CreateDefaultBuilder(args)                .ConfigureServices(services => services.AddAutofac())                .UseStartup<Startup>()                .Build();
            host.Run();        }    }}
using System;using System.Linq;using Autofac;using Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;
namespace AspNetCoreExample{    // ASP.NET Core docs for Autofac are here:    // https://autofac.readthedocs.io/en/latest/integration/aspnetcore.html    public class Startup    {        public Startup(IHostingEnvironment env)        {            var builder = new ConfigurationBuilder()                .SetBasePath(env.ContentRootPath)                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)                .AddEnvironmentVariables();            this.Configuration = builder.Build();        }
        public IConfigurationRoot Configuration { get; private set; }
        public void Configure(IApplicationBuilder app)        {            app.UseMvc();        }
        public void ConfigureContainer(ContainerBuilder builder)        {            // Add any Autofac modules or registrations.            // This is called AFTER ConfigureServices so things you            // register here OVERRIDE things registered in ConfigureServices.            //            // You must have the call to AddAutofac in the Program.Main            // method or this won't be called.            builder.RegisterModule(new AutofacModule());        }
        public void ConfigureServices(IServiceCollection services)        {            // Use extensions from libraries to register services in the            // collection. These will be automatically added to the            // Autofac container.            //            // Note if you have this method return an IServiceProvider            // then ConfigureContainer will not be called.            services.AddMvc();        }    }}

4、注入我们准备好的测试类、接口

  •  
  •  
using Autofac;using AspNetCoreExample.Services;using Microsoft.Extensions.Logging;
namespace AspNetCoreExample{    public class AutofacModule : Module    {        protected override void Load(ContainerBuilder builder)        {            // The generic ILogger<TCategoryName> service was added to the ServiceCollection by ASP.NET Core.            // It was then registered with Autofac using the Populate method. All of this starts            // with the services.AddAutofac() that happens in Program and registers Autofac            // as the service provider.            builder.Register(c => new ValuesService(c.Resolve<ILogger<ValuesService>>()))                .As<IValuesService>()                .InstancePerLifetimeScope();        }    }}

5、小试牛刀,用起来

  •  
  •  
using System.Collections.Generic;using AspNetCoreExample.Services;using Microsoft.AspNetCore.Mvc;
namespace AspNetCoreExample.Controllers{    /// <summary>    /// Simple REST API controller that shows Autofac injecting dependencies.    /// </summary>    /// <seealso cref="Microsoft.AspNetCore.Mvc.Controller" />    [Route("api/[controller]")]    public class ValuesController : Controller    {        private readonly IValuesService _valuesService;
        public ValuesController(IValuesService valuesService)        {            this._valuesService = valuesService;        }
        // GET api/values        [HttpGet]        public IEnumerable<string> Get()        {            return this._valuesService.FindAll();        }
        // GET api/values/5        [HttpGet("{id}")]        public string Get(int id)        {            return this._valuesService.Find(id);        }    }}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值