一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。
前言
今天我们继续讲解一下Autofac容器,这也是重点,大家来看看吧。
Autofac方法注入
方法注入
OnActivated方法支持方法注入
//方法注入
{
ContainerBuilder containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<test>().As<Itest>();
containerBuilder.RegisterType<head>().As<Ihead>();
containerBuilder.RegisterType<root>().As<Iroot>().OnActivated(active =>
{
Ihead ihead = active.Context.Resolve<Ihead>();
active.Instance.add(ihead);
});
IContainer container = containerBuilder.Build();
Iroot r = container.Resolve<Iroot>();
}
单抽象多实现
如何获取全部
IEnumerable<Itest> tList = container.Resolve<IEnumerable<Itest>>();
如果选择某一个
//单抽象多实现
//注册时默认的一般后面会替代后面的
//需要在注册的时候给一个标识,同时获取时也要指定标识,会按照标识创建对象
{
ContainerBuilder containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<test>().Keyed<Itest>("test1");
containerBuilder.RegisterType<testnew>().Keyed<Itest>("test2");
IContainer container = containerBuilder.Build();
Itest t1 = container.ResolveKeyed<Itest>("test1");
Itest t2 = container.ResolveKeyed<Itest>("test2");
}
Autofac支持ASP.NETCore6.0
nuget引入程序集
通过构造函数注入
//Autofac1Controller.cs
using Autofac;
using AutofacDmeo.demo1;
using AutofacDmeo.inproper;
using Microsoft.AspNetCore.Mvc;
namespace 练习Demo.Controllers
{
public class Autofac1Controller : Controller
{
private Itest _itest;
private Ihead _Ihead;
private IEnumerable<Iroot> _list;
public Autofac1Controller(Itest itest, Ihead Ihead, IEnumerable<Iroot> list,IServiceProvider serviceProvider,IComponentContext componentContext)
{
this._itest = itest;
this._Ihead = Ihead;
this._list = list;
Itest itest1 = serviceProvider.GetService<Itest>();
Itest itest2 = componentContext.Resolve<Itest>();
}
public IActionResult Index()
{
return View();
}
}
}
//program.cs
//Autofac整合asp.net core
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); //通过工厂替换,将Autofac整合进来
builder.Host.ConfigureContainer<ContainerBuilder>(c =>
{
c.RegisterType<test>().As<Itest>();
c.RegisterType<head>().As<Ihead>();
c.RegisterType<root>().As<Iroot>();
});
控制器支持属性注入
让容器创建控制器实例
注册每个控制器和抽象之间的关系
支持控制器的实例让IOC容器来创建 ---Autofac创建
支持属性注入
Autofac-AOP支持
Nuget引入程序集
扩展IInterceptor
注册生效
生效特点
1、Nuget引入:Castle.Core
2、扩展一个IInterceptor实现方法
3、注册对象和抽象类的之间方法时,需要执行要支持AOP扩展EnableClassIntercetors
4、要扩展的AOP方法定义为Virtual方法
5、把扩展的IIterceptor也要注册到容器中去
c.RegisterType();
Autofac-AOP的多种支持
类扩展
通过EnableClassInterceptors来支持时:
1、需要把Itercept标记到具体的实现类上 ---扩展IInterceptor也要引用进来 [Intercept(typeof(CustomInterceptor)]
2、特点:必须要是虚方法才能进入到扩展IInterceptor来 ---才能支持AOP扩展
接口扩展
通过EnableInterfaceInterceptors支持时:
1、需要把Intercept标记到抽象(接口) ---扩展IInterceptor也要引用进来[Intercept(typeof(CustomInterceptor)]
2、特点:只要实现了接口无论是否为虚方法,都能进入到扩展IInterceptor来
类扩展和接口扩展额区别
AOP扩展后的案例实操
日志
缓存
//CustomLogIntercept.cs
using Castle.DynamicProxy;
namespace TestDemo.CustomLogIntercept
{
public class CustomLogInterceptor : IInterceptor
{
private readonly ILogger<CustomLogInterceptor> _logger;
public CustomLogInterceptor(ILogger<CustomLogInterceptor> logger)
{
this._logger=logger;
}
public void Intercept(IInvocation invocation)
{
{
_logger.LogInformation($"参数:{Newtonsoft.Json.JsonConvert.SerializeObject(invocation.Arguments)}");
}
invocation.Proceed();
_logger.LogInformation($"{invocation.Method}执行完");
{
_logger.LogInformation($"结果:{Newtonsoft.Json.JsonConvert.SerializeObject(invocation.ReturnValue)}");
}
}
}
}
//program.cs
builder.Logging.AddNLog("Nlog/Nlog.config");
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); //通过工厂替换,将Autofac整合进来
builder.Host.ConfigureContainer<ContainerBuilder>(c =>
{
c.RegisterType<Test>().As<Itest>().EnableClassInterceptors();
c.RegisterType<CustomLogInterceptor>();
});
//CustomLogAController.cs
using Microsoft.AspNetCore.Mvc;
namespace TestDemo.Controllers
{
public class CustomLogAController : Controller
{
private Itest _test;
public CustomLogAController(Itest test)
{
this._test = test;
}
public IActionResult Index()
{
//test t = new test();
//test.giveRes(new
//{
// id="2",
// name="wwww"
//});
_test.GiveRes(new { id = "2", name = "www" });
return View();
}
}
}
//Test.cs
using Autofac.Extras.DynamicProxy;
using TestDemo.CustomLogIntercept;
namespace TestDemo
{
//[Intercept(typeof(CustomLogInterceptor))]
public class Test : Itest
{
public Test()
{
Console.WriteLine($"{this.GetType().Name}被构造了。。");
}
public virtual object GiveRes(object query)
{
return
new
{
id = "1",
name = "Lisa"
};
}
}
}
总结:多思考,多实践,一步步来,加油!