.Netcore讲解(二)

207 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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.csusing 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.csusing 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"
​
            };
        }
    }
}
​

总结:多思考,多实践,一步步来,加油!