zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }
  • 相关阅读:
    hadoop-处理小文件
    hadoop 文件合并
    hadoop multipleoutputs
    超酷的 Vim 搜索技巧
    linux中DHCP服务配置文件/etc/dhcpd.conf详细说明
    cobbler启动问题
    MYSQL 5.5.32的单机多实例部署
    自动化运维之Cobbler自动化部署安装操作系统
    运维自动化之Cobbler系统安装使用详解[good]
    Cobbler自动部署主机系统
  • 原文地址:https://www.cnblogs.com/lyl6796910/p/13772698.html
Copyright © 2011-2022 走看看