目录

一:基本使用

二:简单理解Autofac容器

三:多种注册方式

四:构造函数注入

一:默认构造函数注入

二:选择一个构造函数参数的构造函数

五:属性注入

一:属性注入

二:属性注入扩展--指定属性注入

六:方法注入

七:单个对象多个实现

一:单个对象获取全部实现

二:单个对象获取单个实现

八:ASP.NET Core MVC 项目整合 Autofac

九:控制器属性注入

一:控制器属性注入

二:控制器属性注入--指定属性注入


一:基本使用

  1. 引入Nuget包:Autofac
  2. 创建容器
  3. 配置抽象和具体类之间的关系
  4. Build一下得到容器实例
  5. 获取对象实例

二:简单理解Autofac容器

using Autofac;
using Microsoft.Extensions.DependencyInjection;
using System;namespace Study_ASP.NET_Core_MVC.ConsoleApp
{public static class Program{public static void Main(string[] args){//Autofac容器//1:引入Nuget包:Autofac//2:创建容器ContainerBuilder containerBuilder = new ContainerBuilder();//3:配置抽象和具体类之间的关系containerBuilder.RegisterType<ApplePhone>().As<IPhone>();//4:Build一下得到容器实例IContainer container = containerBuilder.Build();//5:获取对象实例IPhone iPhone = container.Resolve<IPhone>();//调用打电话方法iPhone.Call();//调用发短信方法iPhone.Text();Console.ReadLine();}}/// <summary>/// Interfaces层/// </summary>public interface IPhone{/// <summary>/// 打电话方法/// </summary>void Call();/// <summary>/// 发短信方法/// </summary>void Text();}/// <summary>/// Services层/// </summary>public class ApplePhone : IPhone{/// <summary>/// 打电话方法/// </summary>public void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// <summary>/// 发短信方法/// </summary>public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}}
}

三:多种注册方式

public static void Main(string[] args){//注册抽象和普通类{ContainerBuilder containerBuilder = new ContainerBuilder();containerBuilder.RegisterType<ApplePhone>().As<IPhone>();IContainer container = containerBuilder.Build();IPhone iPhone = container.Resolve<IPhone>();iPhone.Call();iPhone.Text();}//注册具体实例{ContainerBuilder containerBuilder = new ContainerBuilder();containerBuilder.RegisterInstance(new ApplePhone());IContainer container = containerBuilder.Build();IPhone iPhone = container.Resolve<IPhone>();iPhone.Call();iPhone.Text();}//注册泛型{ContainerBuilder containerBuilder = new ContainerBuilder();containerBuilder.RegisterGeneric(typeof(List<>)).As(typeof(IList<>));IContainer container = containerBuilder.Build();IList< IPhone> iPhoneList = container.Resolve<IList<IPhone>>();iPhoneList[0].Call();iPhoneList[0].Text();}//注册程序集{ContainerBuilder containerBuilder = new ContainerBuilder();Assembly interfaceAssembly = Assembly.LoadFrom("Study ASP.NET Core MVC.Interfaces.dll");Assembly serviceAssembly = Assembly.LoadFrom("Study ASP.Net Core MVC.Services.dll");containerBuilder.RegisterAssemblyTypes(interfaceAssembly, serviceAssembly).AsImplementedInterfaces();IContainer container = containerBuilder.Build();IPhone iPhone = container.Resolve<IPhone>();iPhone.Call();iPhone.Text();}//注册抽象类和一段业务逻辑{ContainerBuilder containerBuilder = new ContainerBuilder();containerBuilder.RegisterType<ApplePhone>().As<IPhone>();containerBuilder.Register<IPhone>(context =>{//业务逻辑return new ApplePhone();});IContainer container = containerBuilder.Build();IPhone iPhone = container.Resolve<IPhone>();iPhone.Call();iPhone.Text();}Console.ReadLine();}

四:构造函数注入

一:默认构造函数注入

using Autofac;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Reflection;namespace Study_ASP.NET_Core_MVC.ConsoleApp
{public static class Program{public static void Main(string[] args){//构造函数注入{ContainerBuilder containerBuilder = new ContainerBuilder();containerBuilder.RegisterType<ApplePhone>().As<IPhone>();containerBuilder.RegisterType<Power>().As<IPower>();IContainer container = containerBuilder.Build();IPhone iPhone = container.Resolve<IPhone>();IPower Power =  container.Resolve<IPower>();iPhone.Call();iPhone.Text();}Console.ReadLine();}}/// <summary>/// Interfaces层/// </summary>public interface IPhone{/// <summary>/// 打电话方法/// </summary>void Call();/// <summary>/// 发短信方法/// </summary>void Text();}public interface IPower{}/// <summary>/// Services层/// </summary>public class ApplePhone : IPhone{private IPower iPower;private IPower iPower2;/// <summary>/// 带参构造函数/// </summary>/// <param name="iPower"></param>public ApplePhone(IPower iPower){Console.WriteLine("带参构造函数");this.iPower = iPower;}public ApplePhone(IPower iPower,IPower iPower2){Console.WriteLine("带参构造函数");this.iPower = iPower;this.iPower2 = iPower2;}/// <summary>/// 打电话方法/// </summary>public void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// <summary>/// 发短信方法/// </summary>public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}}public class Power : IPower{}
}

二:选择一个构造函数参数的构造函数

using Autofac;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Reflection;namespace Study_ASP.NET_Core_MVC.ConsoleApp
{public static class Program{public static void Main(string[] args){//构造函数注入{ContainerBuilder containerBuilder = new ContainerBuilder();//如果有多个构造函数,默认选择构造函数中参数最多的构造函数//选择其中只有一个构造函数参数的构造函数containerBuilder.RegisterType<ApplePhone>().UsingConstructor(typeof(IPower)).As<IPhone>();containerBuilder.RegisterType<Power>().As<IPower>();IContainer container = containerBuilder.Build();IPhone iPhone = container.Resolve<IPhone>();IPower Power =  container.Resolve<IPower>();iPhone.Call();iPhone.Text();}Console.ReadLine();}}/// <summary>/// Interfaces层/// </summary>public interface IPhone{/// <summary>/// 打电话方法/// </summary>void Call();/// <summary>/// 发短信方法/// </summary>void Text();}public interface IPower{}/// <summary>/// Services层/// </summary>public class ApplePhone : IPhone{private IPower iPower;private IPower iPower2;/// <summary>/// 带参构造函数/// </summary>/// <param name="iPower"></param>public ApplePhone(IPower iPower){Console.WriteLine("带参构造函数");this.iPower = iPower;}public ApplePhone(IPower iPower,IPower iPower2){Console.WriteLine("带参构造函数");this.iPower = iPower;this.iPower2 = iPower2;}/// <summary>/// 打电话方法/// </summary>public void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// <summary>/// 发短信方法/// </summary>public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}}public class Power : IPower{}
}

五:属性注入

一:属性注入

using Autofac;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Reflection;namespace Study_ASP.NET_Core_MVC.ConsoleApp
{public static class Program{public static void Main(string[] args){//属性注入{ContainerBuilder containerBuilder = new ContainerBuilder();//表示支持属性注入containerBuilder.RegisterType<ApplePhone>().As<IPhone>().PropertiesAutowired();containerBuilder.RegisterType<Power>().As<IPower>();IContainer container = containerBuilder.Build();//调试查看属性注入结果//在对象创建以后,自动给属性创建实例并赋值IPhone iPhone = container.Resolve<IPhone>();IPower Power =  container.Resolve<IPower>();iPhone.Call();iPhone.Text();}Console.ReadLine();}}/// <summary>/// Interfaces层/// </summary>public interface IPhone{/// <summary>/// 打电话方法/// </summary>void Call();/// <summary>/// 发短信方法/// </summary>void Text();}public interface IPower{}/// <summary>/// Services层/// </summary>public class ApplePhone : IPhone{private IPower iPower;private IPower iPower2;/// <summary>/// 带参构造函数/// </summary>/// <param name="iPower"></param>public ApplePhone(IPower iPower){Console.WriteLine("带参构造函数");this.iPower = iPower;}public ApplePhone(IPower iPower,IPower iPower2){Console.WriteLine("带参构造函数");this.iPower = iPower;this.iPower2 = iPower2;}/// <summary>/// 打电话方法/// </summary>public void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// <summary>/// 发短信方法/// </summary>public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}}public class Power : IPower{}
}

二:属性注入扩展--指定属性注入

关键类CusotmSelectAttribute代码:

/// <summary>/// 指定属性注入/// </summary>[AttributeUsage(AttributeTargets.Property)]public class CusotmSelectAttribute : Attribute{}

关键类CusotmPropertySelector代码:

/// <summary>/// 实现Autofac/// 判断属性/// 需要属性注入/// </summary>public class CusotmPropertySelector : IPropertySelector{public bool InjectProperty(PropertyInfo propertyInfo,object instance){//判断属性需要属性注入return propertyInfo.CustomAttributes.Any(c => c.AttributeType == typeof(CusotmSelectAttribute));}}

使用特性属性注入:

using Autofac;
using Autofac.Core;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Reflection;namespace Study_ASP.NET_Core_MVC.ConsoleApp
{public static class Program{public static void Main(string[] args){//属性注入{ContainerBuilder containerBuilder = new ContainerBuilder();//表示支持属性注入containerBuilder.RegisterType<ApplePhone>().As<IPhone>().PropertiesAutowired(new CusotmPropertySelector());containerBuilder.RegisterType<Power>().As<IPower>();IContainer container = containerBuilder.Build();//调试查看属性注入结果//在对象创建以后,自动给属性创建实例并赋值IPhone iPhone = container.Resolve<IPhone>();IPower Power = container.Resolve<IPower>();iPhone.Call();iPhone.Text();}Console.ReadLine();}}/// <summary>/// Interfaces层/// </summary>public interface IPhone{/// <summary>/// 打电话方法/// </summary>void Call();/// <summary>/// 发短信方法/// </summary>void Text();}public interface IPower{}/// <summary>/// Services层/// </summary>public class ApplePhone : IPhone{private IPower iPower;private IPower iPower2;/// <summary>/// 标记支持属性注入特性/// </summary>[CusotmSelect]public IPower Power { get; set; }/// <summary>/// 带参构造函数/// </summary>/// <param name="iPower"></param>public ApplePhone(IPower iPower){Console.WriteLine("带参构造函数");this.iPower = iPower;}public ApplePhone(IPower iPower, IPower iPower2){Console.WriteLine("带参构造函数");this.iPower = iPower;this.iPower2 = iPower2;}/// <summary>/// 打电话方法/// </summary>public void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// <summary>/// 发短信方法/// </summary>public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}}public class Power : IPower{}/// <summary>/// 指定属性注入/// </summary>[AttributeUsage(AttributeTargets.Property)]public class CusotmSelectAttribute : Attribute{}/// <summary>/// 实现Autofac/// 判断属性/// 需要属性注入/// </summary>public class CusotmPropertySelector : IPropertySelector{public bool InjectProperty(PropertyInfo propertyInfo,object instance){//判断属性需要属性注入return propertyInfo.CustomAttributes.Any(c => c.AttributeType == typeof(CusotmSelectAttribute));}}
}

六:方法注入

using Autofac;
using Autofac.Core;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Reflection;namespace Study_ASP.NET_Core_MVC.ConsoleApp
{public static class Program{public static void Main(string[] args){//方法注入{ContainerBuilder containerBuilder = new ContainerBuilder();//表示支持方法注入containerBuilder.RegisterType<ApplePhone>().As<IPhone>().OnActivated(activa =>{IPower iPower = activa.Context.Resolve<IPower>();activa.Instance.OpenPhone(iPower);});containerBuilder.RegisterType<Power>().As<IPower>();IContainer container = containerBuilder.Build();//调试查看方法注入结果//在对象创建以后,自动给属性创建实例并赋值IPhone iPhone = container.Resolve<IPhone>();IPower Power = container.Resolve<IPower>();iPhone.Call();iPhone.Text();}Console.ReadLine();}}/// <summary>/// Interfaces层/// </summary>public interface IPhone{/// <summary>/// 打电话方法/// </summary>void Call();/// <summary>/// 发短信方法/// </summary>void Text();}public interface IPower{}/// <summary>/// Services层/// </summary>public class ApplePhone : IPhone{private IPower iPower;private IPower iPower2;/// <summary>/// 带参构造函数/// </summary>/// <param name="iPower"></param>public ApplePhone(IPower iPower){Console.WriteLine("带参构造函数");this.iPower = iPower;}public ApplePhone(IPower iPower, IPower iPower2){Console.WriteLine("带参构造函数");this.iPower = iPower;this.iPower2 = iPower2;}/// <summary>/// 打电话方法/// </summary>public void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// <summary>/// 发短信方法/// </summary>public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}/// <summary>/// 打开手机方法/// </summary>/// <param name="iPower">打开手机</param>public void OpenPhone(IPower iPower){Console.WriteLine("{0}打开手机", iPower);}}public class Power : IPower{}
}

七:单个对象多个实现

一:单个对象获取全部实现

using Autofac;
using Autofac.Core;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Reflection;namespace Study_ASP.NET_Core_MVC.ConsoleApp
{public static class Program{public static void Main(string[] args){{ContainerBuilder containerBuilder = new ContainerBuilder();//单个抽象多个实现containerBuilder.RegisterType<ApplePhone>().As<IPhone>();containerBuilder.RegisterType<VivoPhone>().As<IPhone>();containerBuilder.RegisterType<Power>().As<IPower>();IContainer container = containerBuilder.Build();//调试查看方法注入结果IPhone iPhone = container.Resolve<IPhone>();IPower Power = container.Resolve<IPower>();IEnumerable<IPhone> iPhoneList = container.Resolve<IEnumerable<IPhone>>();iPhone.Call();iPhone.Text();foreach(IPhone phone in iPhoneList){phone.Call();phone.Text();}}Console.ReadLine();}}/// <summary>/// Interfaces层/// </summary>public interface IPhone{/// <summary>/// 打电话方法/// </summary>void Call();/// <summary>/// 发短信方法/// </summary>void Text();}public interface IPower{}/// <summary>/// Services层/// </summary>public class ApplePhone : IPhone{private IPower iPower;private IPower iPower2;/// <summary>/// 带参构造函数/// </summary>/// <param name="iPower"></param>public ApplePhone(IPower iPower){Console.WriteLine("带参构造函数");this.iPower = iPower;}public ApplePhone(IPower iPower, IPower iPower2){Console.WriteLine("带参构造函数");this.iPower = iPower;this.iPower2 = iPower2;}/// <summary>/// 打电话方法/// </summary>public void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// <summary>/// 发短信方法/// </summary>public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}/// <summary>/// 打开手机方法/// </summary>/// <param name="iPower">打开手机</param>public void OpenPhone(IPower iPower){Console.WriteLine("{0}打开手机", iPower);}}public class VivoPhone : IPhone{private IPower iPower;private IPower iPower2;/// <summary>/// 带参构造函数/// </summary>/// <param name="iPower"></param>public VivoPhone(IPower iPower){Console.WriteLine("带参构造函数");this.iPower = iPower;}public VivoPhone(IPower iPower, IPower iPower2){Console.WriteLine("带参构造函数");this.iPower = iPower;this.iPower2 = iPower2;}/// <summary>/// 打电话方法/// </summary>public void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// <summary>/// 发短信方法/// </summary>public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}/// <summary>/// 打开手机方法/// </summary>/// <param name="iPower">打开手机</param>public void OpenPhone(IPower iPower){Console.WriteLine("{0}打开手机", iPower);}}public class Power : IPower{}
}

二:单个对象获取单个实现

using Autofac;
using Autofac.Core;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Reflection;namespace Study_ASP.NET_Core_MVC.ConsoleApp
{public static class Program{public static void Main(string[] args){{ContainerBuilder containerBuilder = new ContainerBuilder();//单个抽象多个实现containerBuilder.RegisterType<ApplePhone>().Keyed<IPhone>("ApplePhone");containerBuilder.RegisterType<VivoPhone>().Keyed<IPhone>("VivoPhone");containerBuilder.RegisterType<Power>().As<IPower>();IContainer container = containerBuilder.Build();//调试查看方法注入结果,注入时指定标识,按照标识匹配创建对象IPhone applePhone = container.ResolveKeyed<IPhone>("ApplePhone");IPhone vivoPhone = container.ResolveKeyed<IPhone>("VivoPhone");applePhone.Call();vivoPhone.Text();}Console.ReadLine();}}/// <summary>/// Interfaces层/// </summary>public interface IPhone{/// <summary>/// 打电话方法/// </summary>void Call();/// <summary>/// 发短信方法/// </summary>void Text();}public interface IPower{}/// <summary>/// Services层/// </summary>public class ApplePhone : IPhone{private IPower iPower;private IPower iPower2;/// <summary>/// 带参构造函数/// </summary>/// <param name="iPower"></param>public ApplePhone(IPower iPower){Console.WriteLine("带参构造函数");this.iPower = iPower;}public ApplePhone(IPower iPower, IPower iPower2){Console.WriteLine("带参构造函数");this.iPower = iPower;this.iPower2 = iPower2;}/// <summary>/// 打电话方法/// </summary>public void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// <summary>/// 发短信方法/// </summary>public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}/// <summary>/// 打开手机方法/// </summary>/// <param name="iPower">打开手机</param>public void OpenPhone(IPower iPower){Console.WriteLine("{0}打开手机", iPower);}}public class VivoPhone : IPhone{private IPower iPower;private IPower iPower2;/// <summary>/// 带参构造函数/// </summary>/// <param name="iPower"></param>public VivoPhone(IPower iPower){Console.WriteLine("带参构造函数");this.iPower = iPower;}public VivoPhone(IPower iPower, IPower iPower2){Console.WriteLine("带参构造函数");this.iPower = iPower;this.iPower2 = iPower2;}/// <summary>/// 打电话方法/// </summary>public void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// <summary>/// 发短信方法/// </summary>public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}/// <summary>/// 打开手机方法/// </summary>/// <param name="iPower">打开手机</param>public void OpenPhone(IPower iPower){Console.WriteLine("{0}打开手机", iPower);}}public class Power : IPower{}
}

八:ASP.NET Core MVC 项目整合 Autofac

一:在当前项目右键管理Nuget包引入:Autofac和Autofac.Extensions.DependencyInjection

二:在当前项目中配置Autofac,修改Program.cs文件

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;//表示整个应用程序,调用CreateBuilder方法创建一个WebApplicationBuilder对象。
var builder = WebApplication.CreateBuilder(args);
//向管道容器添加注册中间件
//添加注册控制器视图中间件
builder.Services.AddControllersWithViews();
//添加注册Session中间件
builder.Services.AddSession();//添加注册Autofac中间件
//通过工厂替换整合Autofac
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{//注册服务containerBuilder.RegisterType<IMicroPhone>().As<MicroPhone>();containerBuilder.RegisterType<IHeadPhone>().As<HeadPhone>();containerBuilder.RegisterType<IPhone>().As<ApplePhone>();
});//配置管道容器中间件,构造WebApplication实例
var app = builder.Build();
//判断是否是开发模式
if (!app.Environment.IsDevelopment())
{//向管道中添加中间件,该中间件将捕获异常、记录异常、重置请求路径并重新执行请求。app.UseExceptionHandler("/Shared/Error");//向管道中添加用于使用HSTS的中间件,该中间件添加了Strict Transport Security标头。默认值为30天app.UseHsts();
}
//向管道添加Session中间件
app.UseSession();
//向管道添加用于将HTTP请求重定向到HTTPS的中间件。
app.UseHttpsRedirection();
//向管道添加为当前请求路径启用静态文件服务
app.UseStaticFiles();
//向管道添加路由配置中间件
app.UseRouting();
//向管道添加鉴权中间件
app.UseAuthentication();
//向管道添加授权中间件
app.UseAuthorization();
//向管道添加默认路由中间件
app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
//向管道添加启动应用程序中间件
app.Run();

三:控制器中应用Autofac

using Autofac;
using Microsoft.AspNetCore.Mvc;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;
using System.Diagnostics;namespace Study_ASP.NET_Core_MVC.Controllers
{public class HomeController : Controller{/// <summary>/// 定义构造函数/// </summary>private readonly ILogger<HomeController> _logger;private IPhone iPhone;private IMicroPhone microPhone;private IHeadPhone headPhone;private IEnumerable<IPhone> iPhoneList;/// <summary>/// 初始化构造函数/// </summary>/// <param name="logger">控制器构造函数</param>/// <param name="serviceProvider">服务构造函数</param>/// <param name="componentContext">上下文构造函数</param>/// <param name="iPhone">自定义构造函数</param>/// <param name="microPhone">自定义构造函数</param>/// <param name="headPhone">自定义构造函数</param>/// <param name="iPhoneList">自定义构造函数集合</param>public HomeController(ILogger<HomeController> logger, IServiceProvider serviceProvider, IComponentContext componentContext, IPhone iPhone, IMicroPhone microPhone, IHeadPhone headPhone, IEnumerable<IPhone> iPhoneList){//通过调试查看获取的数据_logger = logger;IHeadPhone iPhone1 = serviceProvider.GetService<IHeadPhone>();IMicroPhone iPhone2 = componentContext.Resolve<IMicroPhone>();this.iPhone = iPhone;this.microPhone = microPhone;this.headPhone = headPhone;this.iPhoneList = iPhoneList;}/// <summary>/// Get请求/// Home控制器/// Index方法/// </summary>/// <returns></returns>[HttpGet]public IActionResult Index(){//调用打电话方法iPhone.Call();//调用发短信方法iPhone.Text();//电泳显示实践方法ViewBag.ShowTime = iPhone.ShowTime(DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"));return View();}}
}

九:控制器属性注入

一:控制器属性注入

修改Program.cs文件

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;//表示整个应用程序,调用CreateBuilder方法创建一个WebApplicationBuilder对象。
var builder = WebApplication.CreateBuilder(args);
//向管道容器添加注册中间件
//添加注册控制器视图中间件
builder.Services.AddControllersWithViews();
//添加注册Session中间件
builder.Services.AddSession();//添加注册Autofac中间件
//通过工厂替换整合Autofac
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{//注册服务containerBuilder.RegisterType<MicroPhone>().As<IMicroPhone>();containerBuilder.RegisterType<HeadPhone>().As<IHeadPhone>();containerBuilder.RegisterType<ApplePhone>().As<IPhone>();//注册控制器和抽象关系var controllerBaseType = typeof(ControllerBase);//支持属性注入到ControllerBase中containerBuilder.RegisterAssemblyTypes(typeof(Program).Assembly).Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType).PropertiesAutowired();
});
//添加注册控制器属性注入
builder.Services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());//配置管道容器中间件,构造WebApplication实例
var app = builder.Build();
//判断是否是开发模式
if (!app.Environment.IsDevelopment())
{//向管道中添加中间件,该中间件将捕获异常、记录异常、重置请求路径并重新执行请求。app.UseExceptionHandler("/Shared/Error");//向管道中添加用于使用HSTS的中间件,该中间件添加了Strict Transport Security标头。默认值为30天app.UseHsts();
}
//向管道添加Session中间件
app.UseSession();
//向管道添加用于将HTTP请求重定向到HTTPS的中间件。
app.UseHttpsRedirection();
//向管道添加为当前请求路径启用静态文件服务
app.UseStaticFiles();
//向管道添加路由配置中间件
app.UseRouting();
//向管道添加鉴权中间件
app.UseAuthentication();
//向管道添加授权中间件
app.UseAuthorization();
//向管道添加默认路由中间件
app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
//向管道添加启动应用程序中间件
app.Run();

修改控制器文件

using Autofac;
using Microsoft.AspNetCore.Mvc;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;
using System.Diagnostics;namespace Study_ASP.NET_Core_MVC.Controllers
{public class HomeController : Controller{/// <summary>/// 定义构造函数/// </summary>private readonly ILogger<HomeController> _logger;private IPhone iPhone;private IMicroPhone microPhone;private IHeadPhone headPhone;private IEnumerable<IPhone> iPhoneList;public IMicroPhone iMicroPhoneProp { get; set; }public IMicroPhone iMicroPhoneProp1 { get; set; }/// <summary>/// 初始化构造函数/// </summary>/// <param name="logger">控制器构造函数</param>/// <param name="serviceProvider">服务构造函数</param>/// <param name="componentContext">上下文构造函数</param>/// <param name="iPhone">自定义构造函数</param>/// <param name="microPhone">自定义构造函数</param>/// <param name="headPhone">自定义构造函数</param>/// <param name="iPhoneList">自定义构造函数集合</param>public HomeController(ILogger<HomeController> logger, IServiceProvider serviceProvider, IComponentContext componentContext, IPhone iPhone, IMicroPhone microPhone, IHeadPhone headPhone, IEnumerable<IPhone> iPhoneList){//通过调试查看获取的数据_logger = logger;IHeadPhone iPhone1 = serviceProvider.GetService<IHeadPhone>();IMicroPhone iPhone2 = componentContext.Resolve<IMicroPhone>();this.iPhone = iPhone;this.microPhone = microPhone;this.headPhone = headPhone;this.iPhoneList = iPhoneList;}/// <summary>/// Get请求/// Home控制器/// Index方法/// </summary>/// <returns></returns>[HttpGet]public IActionResult Index(){//调用打电话方法iPhone.Call();//调用发短信方法iPhone.Text();//电泳显示实践方法ViewBag.ShowTime = iPhone.ShowTime(DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"));return View();}}
}

二:控制器属性注入--指定属性注入

一:关键类CusotmSelectAttribute代码

/// <summary>/// 指定属性注入/// </summary>[AttributeUsage(AttributeTargets.Property)]public class CusotmSelectAttribute : Attribute{}

二:关键类CusotmPropertySelector代码

/// <summary>/// 实现Autofac/// 判断属性/// 需要属性注入/// </summary>public class CusotmPropertySelector : IPropertySelector{public bool InjectProperty(PropertyInfo propertyInfo,object instance){//判断属性需要属性注入return propertyInfo.CustomAttributes.Any(c => c.AttributeType == typeof(CusotmSelectAttribute));}}

三:修改Program.cs文件

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;//表示整个应用程序,调用CreateBuilder方法创建一个WebApplicationBuilder对象。
var builder = WebApplication.CreateBuilder(args);
//向管道容器添加注册中间件
//添加注册控制器视图中间件
builder.Services.AddControllersWithViews();
//添加注册Session中间件
builder.Services.AddSession();//添加注册Autofac中间件
//通过工厂替换整合Autofac
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{//注册服务containerBuilder.RegisterType<MicroPhone>().As<IMicroPhone>();containerBuilder.RegisterType<HeadPhone>().As<IHeadPhone>();containerBuilder.RegisterType<ApplePhone>().As<IPhone>();//注册控制器和抽象关系var controllerBaseType = typeof(ControllerBase);//支持属性注入到ControllerBase中containerBuilder.RegisterAssemblyTypes(typeof(Program).Assembly).Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType).PropertiesAutowired(new CusotmPropertySelector());
});
//添加注册控制器属性注入
builder.Services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());//配置管道容器中间件,构造WebApplication实例
var app = builder.Build();
//判断是否是开发模式
if (!app.Environment.IsDevelopment())
{//向管道中添加中间件,该中间件将捕获异常、记录异常、重置请求路径并重新执行请求。app.UseExceptionHandler("/Shared/Error");//向管道中添加用于使用HSTS的中间件,该中间件添加了Strict Transport Security标头。默认值为30天app.UseHsts();
}
//向管道添加Session中间件
app.UseSession();
//向管道添加用于将HTTP请求重定向到HTTPS的中间件。
app.UseHttpsRedirection();
//向管道添加为当前请求路径启用静态文件服务
app.UseStaticFiles();
//向管道添加路由配置中间件
app.UseRouting();
//向管道添加鉴权中间件
app.UseAuthentication();
//向管道添加授权中间件
app.UseAuthorization();
//向管道添加默认路由中间件
app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
//向管道添加启动应用程序中间件
app.Run();

三:修改控制器代码

using Autofac;
using Microsoft.AspNetCore.Mvc;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;
using System.Diagnostics;namespace Study_ASP.NET_Core_MVC.Controllers
{public class HomeController : Controller{/// <summary>/// 定义构造函数/// </summary>private readonly ILogger<HomeController> _logger;private IPhone iPhone;private IMicroPhone microPhone;private IHeadPhone headPhone;private IEnumerable<IPhone> iPhoneList;/// <summary>/// 标识属性注入/// </summary>[CusotmSelect]public IMicroPhone iMicroPhoneProp { get; set; }public IMicroPhone iMicroPhoneProp1 { get; set; }/// <summary>/// 初始化构造函数/// </summary>/// <param name="logger">控制器构造函数</param>/// <param name="serviceProvider">服务构造函数</param>/// <param name="componentContext">上下文构造函数</param>/// <param name="iPhone">自定义构造函数</param>/// <param name="microPhone">自定义构造函数</param>/// <param name="headPhone">自定义构造函数</param>/// <param name="iPhoneList">自定义构造函数集合</param>public HomeController(ILogger<HomeController> logger, IServiceProvider serviceProvider, IComponentContext componentContext, IPhone iPhone, IMicroPhone microPhone, IHeadPhone headPhone, IEnumerable<IPhone> iPhoneList){//通过调试查看获取的数据_logger = logger;IHeadPhone iPhone1 = serviceProvider.GetService<IHeadPhone>();IMicroPhone iPhone2 = componentContext.Resolve<IMicroPhone>();this.iPhone = iPhone;this.microPhone = microPhone;this.headPhone = headPhone;this.iPhoneList = iPhoneList;}/// <summary>/// Get请求/// Home控制器/// Index方法/// </summary>/// <returns></returns>[HttpGet]public IActionResult Index(){//调用打电话方法iPhone.Call();//调用发短信方法iPhone.Text();//电泳显示实践方法ViewBag.ShowTime = iPhone.ShowTime(DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"));return View();}}
}

ASP.NET Core MVC 项目 Autofac相关推荐

  1. ASP.net Core MVC项目给js文件添加版本号

    需求:使用ASP.net Core Mvc开发公司内部web系统,给视图中js(css,image也可以)文件添加版本号避免缓存问题. 解决方法:利用Taghelper提供的标签(asp-append ...

  2. ASP.NET Core MVC+EF Core从开发到部署

    笔记本电脑装了双系统(Windows 10和Ubuntu16.04)快半年了,平时有时间就喜欢切换到Ubuntu系统下耍耍Linux,熟悉熟悉Linux命令.Shell脚本以及Linux下的各种应用的 ...

  3. 为什么 web 开发人员需要迁移到. NET Core, 并使用 ASP.NET Core MVC 构建 web 和 API

    2018 .NET开发者调查报告: .NET Core 是怎么样的状态,这里我们看到了还有非常多的.net开发人员还在观望,本文给大家一个建议.这仅代表我的个人意见, 我有充分的理由推荐.net 程序 ...

  4. 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)

    1 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Microsoft Graph 服务针对一些主流的 ...

  5. ASP.NET Core MVC 之区域(Area)

    区域(Area)是一个 ASP.NET MVC 功能,用于将相关功能组织为一个单独的命名空间(用于路由)和文件结构(用于视图).使用区域通过向控制器和操作添加 一个路由参数(area)来创建用于路由目 ...

  6. asp 判断数组等于_如何在 ASP.NET Core MVC 中处理 404 错误

    译文链接:https://www.infoworld.com/article/3545304/how-to-handle-404-errors-in-aspnet-core-mvc.html http ...

  7. ssm框架使用重定向报404_如何在 ASP.NET Core MVC 中处理 404 错误

    译文链接:https://www.infoworld.com/article/3545304/how-to-handle-404-errors-in-aspnet-core-mvc.html asp. ...

  8. asp 文本转时间_三分钟学会在ASP.NET Core MVC 中使用Cookie

    一.Cookie是什么? 我的朋友问我cookie是什么,用来干什么的,可是我居然无法清楚明白简短地向其阐述cookie,这不禁让我陷入了沉思:为什么我无法解释清楚,我对学习的方法产生了怀疑!所以我们 ...

  9. 使用Vue.js和ASP.NET Core MVC实现CQRS模式

    目录 介绍 先决条件 深入了解基本信息 应用解决方案结构 图像上传和显示应用 MVC与JS框架之间的通信设计 在SPA中,在表示层中添加UI和PLL 用于数据读取和写入操作的数据访问层 软件包安装 读 ...

最新文章

  1. wpf每隔一小时_包河区徐河排涝站24小时不间断运作 11座区管泵站全面应战保安澜...
  2. 解析TOMCAT框架 .
  3. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(一)
  4. c语言ascii码表数字,求教!我想显示数字但是现在显示的却是数字在ASCII码中对应的符...
  5. python prettytable表格列数太多_excel列数太多了怎么办
  6. 去超市一定要存包吗_去东京一定要去的富士河口湖
  7. Android dialog中显示一个超链接
  8. python原创第十四篇~判断,循环实战训练+答案
  9. Python Itertools
  10. 深度 | Google Brain研究工程师:为什么随机性对于深度学习如此重要?
  11. 计算机学科技术前沿:云计算主要平台及特性
  12. 游戏资源提取常用工具索引
  13. 西门子PS2阀门定位器在调试中常见问题
  14. Matlab求平均值函数mean
  15. fullCalendar日历:中文API
  16. 使用THREE.js制作一款3D游戏
  17. WordPress教程网站
  18. 卷积神经网络学习路线(二十一) | 旷世科技 ECCV 2018 ShuffleNet V2
  19. git在idea中的冲突解决(非常重要)
  20. 手机、平板与手表,华为一个都不能少

热门文章

  1. 4月TIOBE编程排行榜:Python第三、继续上涨!2021薪资多少?
  2. 牛贴:深刻分析一个黄色笑话
  3. 美甲店如何通过小红书开拓渠道?美甲店做小红书有效果吗
  4. 2022年安全生产监管人员考试题及答案
  5. 哎宽带账号密码忘记了老king来帮你解决
  6. 单行文本溢 和 多行文本溢出
  7. webug————显错注入
  8. 二参数威布尔分布matlab,基于MATLAB的威布尔分布参数估计的图形界面设计
  9. php 怎么查看日志,怎么看php错误日志
  10. Python协程的四种实现方式