4 Autofac 增强容器:引入AOP (.net上手笔记)

96 阅读1分钟

当我们需要,基于名称的注入,属性注入,子容器。 基于动态代理的AOP.

做为新手,先蒙b 一下下

1 初体验。

1.1 nudget 安装扩展

image.png

1.2 注入操作。

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());


builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
    //注册方法有点不一样。
    containerBuilder.RegisterType<MyService2>().As<IMyService>().InstancePerLifetimeScope();
});

1.3 使用。

        public WeatherForecastController( IMyService myService )
        {
               _myService = myService;
        }
        
         Console.WriteLine($"_myService  {_myService.ToString()}                                        code{_myService.GetHashCode()}  ");
        

2 获取命名的服务 。

            builder.RegisterType<MyService>().As<IMyService>();
            //注册命名服务 。
            builder.RegisterType<MyServiceV2>().Named<IMyService>("service2");
            
            
         //startup.cs 拿服务,并输出。   
         public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {


            this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();

            var service = this.AutofacContainer.ResolveNamed<IMyService>("service2");
            service.show();  
            
            //取非命名的。
            var serviceOrig = this.AutofacContainer.ResolveNamed<IMyService>("service2");
            serviceOrig.show();  

image.png

3 属性注入。

  builder.RegisterType<MyServiceV2>().Named<IMyService>("service2").PropertiesAutowired();
  
  //注意,要将注入的属性类,也注入为服务 。
              builder.RegisterType<MyService>().As<IMyService>();
  

image.png

4 Aop 场景 。(不改变原有类的情况下,在切面上执行业)

4.1 写拦截器。

using Castle.DynamicProxy;

namespace p1.Services
{
    public class AopCache : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            Console.WriteLine($"ApoCache Intercept start {invocation.Method.Name}");
            invocation.Proceed();
            Console.WriteLine("ApoCache Intercept end {invocation.ReturnValue}");
        }
    }
}

4.2 开启拦截器。 (接口)

builder.Host.ConfigureContainer<ContainerBuilder>(builder => {
    builder.RegisterType<AopCache>();
    
    //这里是接口拦截器。
    builder.RegisterType<MyService>().As<IMyService>().InterceptedBy(typeof(AopCache)).EnableInterfaceInterceptors();

});

image.png

4.3 实现一个类拦截器。

1 建个类,然后设置好拦截器。注册是虚方法 。

using Autofac.Extras.DynamicProxy;
namespace p1.Services
{
    [Intercept(typeof(AopCache))]
    public class GetDataClass
    {

        virtual public string GetTime()
        {
            Console.WriteLine("here is GetDataClass.GetTime");
            return DateTime.Now.ToString("G");
        }

    }
}

//programe.cs 中注册进去。
 builder.RegisterType<GetDataClass>().EnableClassInterceptors();

image.png

5 子容器。


1 注册到子容器中。

找到父容器。

using (var myscope = AutofacContainer.BeginLifetimeScope("myscope"))
{
    var s0 = myscope.Resolve<MyNameService>();
    
    ....
    
    
}


当不期望在根容器创建,又希望在某范围内单例时,可以做如下处理。

官网又tmd 打不开,坑多心累。