900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > ASP.NET Core MVC 项目 Autofac

ASP.NET Core MVC 项目 Autofac

时间:2019-03-25 18:02:26

相关推荐

ASP.NET Core MVC 项目 Autofac

目录

一:基本使用

二:简单理解Autofac容器

三:多种注册方式

四:构造函数注入

一:默认构造函数注入

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

五:属性注入

一:属性注入

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

六:方法注入

七:单个对象多个实现

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

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

八: Core MVC 项目整合 Autofac

九:控制器属性注入

一:控制器属性注入

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

一:基本使用

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

二:简单理解Autofac容器

using Autofac;using Microsoft.Extensions.DependencyInjection;using System;namespace _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 Core MVC.Interfaces.dll");Assembly serviceAssembly = Assembly.LoadFrom("Study 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 _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 _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 _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 _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 _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 _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 _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{}}

八: Core MVC 项目整合 Autofac

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

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

using Autofac;using Autofac.Extensions.DependencyInjection;using _Core_MVC.Services;using _Core_MVC.Interfaces;//表示整个应用程序,调用CreateBuilder方法创建一个WebApplicationBuilder对象。var builder = WebApplication.CreateBuilder(args);//向管道容器添加注册中间件//添加注册控制器视图中间件builder.Services.AddControllersWithViews();//添加注册Session中间件builder.Services.AddSession();//添加注册Autofac中间件//通过工厂替换整合Autofacbuilder.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 _Core_MVC.Services;using _Core_MVC.Interfaces;using _Core_MVC.Models;using System.Diagnostics;namespace _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 _Core_MVC.Services;using _Core_MVC.Interfaces;using _Core_MVC.Models;//表示整个应用程序,调用CreateBuilder方法创建一个WebApplicationBuilder对象。var builder = WebApplication.CreateBuilder(args);//向管道容器添加注册中间件//添加注册控制器视图中间件builder.Services.AddControllersWithViews();//添加注册Session中间件builder.Services.AddSession();//添加注册Autofac中间件//通过工厂替换整合Autofacbuilder.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 _Core_MVC.Services;using _Core_MVC.Interfaces;using _Core_MVC.Models;using System.Diagnostics;namespace _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 _Core_MVC.Services;using _Core_MVC.Interfaces;using _Core_MVC.Models;//表示整个应用程序,调用CreateBuilder方法创建一个WebApplicationBuilder对象。var builder = WebApplication.CreateBuilder(args);//向管道容器添加注册中间件//添加注册控制器视图中间件builder.Services.AddControllersWithViews();//添加注册Session中间件builder.Services.AddSession();//添加注册Autofac中间件//通过工厂替换整合Autofacbuilder.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 _Core_MVC.Services;using _Core_MVC.Interfaces;using _Core_MVC.Models;using System.Diagnostics;namespace _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();}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。