当前位置 博文首页 > 做自己-jason:Asp.netCore 3.1控制器属性注入and异步事务Aop by

    做自己-jason:Asp.netCore 3.1控制器属性注入and异步事务Aop by

    作者:做自己-jason 时间:2021-01-30 15:57

    Aspect Oriented Programming(AOP)是较为热门的一个话题。AOP,国内我们都习惯称之为:面向切面编程

    下面直接code 干货展示:

    1:导入相关的包:AutoFac 默认最新稳定版即可


    Autofac.Extensions.DependencyInjection Version="7.1.0" 
    Autofac.Extras.DynamicProxy Version="6.0.0"

     

    2:AutoFac注入的扩展方法

     1 using System;
     2 using System.Linq;
     3 namespace ZRF.CRM.Commoms
     4 {
     5     using Autofac;
     6     using Autofac.Extras.DynamicProxy;
     7     using Microsoft.AspNetCore.Mvc;
     8     using System.Reflection;
     9     using ZRF.CRM.Commoms.Interceptors;
    10     using ZRF.CRM.MyAttrobutrs;
    11 
    12     public static class ContainerBuilderExtenTion
    13     {
    14         public static void DependInjecterIoc(this ContainerBuilder builder)
    15         {
    16             builder.RegisterType<TransactionScopeAsyncInterCeptor>();
    17             builder.RegisterAssemblyTypes(Assembly.Load("ZRF.CRM.Service"))
    18                 .AsImplementedInterfaces().PropertiesAutowired().InterceptedBy(typeof(TransactionScopeAsyncInterCeptor)).EnableInterfaceInterceptors().OnRegistered(t =>
    19                 {
    20                     Console.WriteLine("ZRF.CRM.Service===Register_ok");
    21                 });
    22         }
    23     }
    24 }

    3:新增ConfigureContainer(ContainerBuilder builder)方法,并在Startup方法中注册

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Reflection;
     5 using System.Threading.Tasks;
     7 using Autofac;
     8 using Microsoft.AspNetCore.Builder;
     9 using Microsoft.AspNetCore.Hosting;
    10 using Microsoft.AspNetCore.Mvc;
    11 using Microsoft.AspNetCore.Mvc.Controllers;
    12 using Microsoft.Extensions.Configuration;
    13 using Microsoft.Extensions.DependencyInjection;
    14 using Microsoft.Extensions.DependencyInjection.Extensions;
    15 using Microsoft.Extensions.Hosting;
    16 using WebApplication1.IOCS;
    17 using ZRF.CRM.Commoms;
    18 namespace WebApplication1
    19 {
    20     public class Startup
    21     {
    22         public Startup(IConfiguration configuration)
    23         {
    24             Configuration = configuration;
    25         }
    26         public void ConfigureContainer(ContainerBuilder builder)
    27         {
    28             builder.DependInjecterIoc();
    29 
    30             //控制器属性注入
    31             builder.RegisterModule<ControllerModule>();
    32         }
    33         public IConfiguration Configuration { get; }
    34 
    35         // This method gets called by the runtime. Use this method to add services to the container.
    36         public void ConfigureServices(IServiceCollection services)
    37         {
    38             services.AddControllersWithViews();
    39 
    40             //core 3.0级以上
    41             services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
    42         }
    43 
    44         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    45         public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    46         {
    47             if (env.IsDevelopment())
    48             {
    49                 app.UseDeveloperExceptionPage();
    50             }
    51             else
    52             {
    53                 app.UseExceptionHandler("/Home/Error");
    54             }
    55             app.UseStaticFiles();
    56 
    57             app.UseRouting();
    58 
    59             app.UseAuthorization();
    60 
    61             app.UseEndpoints(endpoints =>
    62             {
    63                 endpoints.MapControllerRoute(
    64                     name: "default",
    65                     pattern: "{controller=Home}/{action=Index}/{id?}");
    66             });
    67         }
    68     }
    69 }

    4:Controller

     1 using Microsoft.AspNetCore.Mvc;
     2 using Microsoft.Extensions.Logging;
     3 using System;
     4 using System.Collections.Generic;
     5 using System.Diagnostics;
     6 using System.Linq;
     7 using System.Threading.Tasks;
     8 using WebApplication1.Models;
     9 using ZRF.CRM.MyAttrobutrs;
    10 using ZRF.CRM.InterFaces;
    11 namespace WebApplication1.Controllers
    12 {
    13     [ControllerCanInjectPropertity]
    14     public class HomeController : Controller
    15     {
    16         private readonly ILogger<HomeController> _logger;
    17 
    18         IDoLog _dolog;
    19         ITest002Service _service;
    20         public IDoLog _dolog2 { get; set; }
    21 
    22         public HomeController(ILogger<HomeController> logger, IDoLog dolog, ITest002Service service)
    23         {
    24             _logger = logger;
    25             _dolog = dolog;
    26             this._service = service;
    27         }
    28 
    29         public IActionResult Index()
    30         {
    31             var boolflag = _dolog2.LogWork("aaaa");
    32             bool flag = _dolog.LogWork("qqai");
    33             var getMsg = _service.Dowork("有aop的方法");
    34             Console.WriteLine("Aop获取到方法:" + getMsg);
    35             //_service.DoWork02("没有aop的普通方法");
    36             return View();
    37         }
    38 
    39         public IActionResult Privacy()
    40         {
    41             return View();
    42         }
    43 
    44         [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    45         public IActionResult Error()
    46         {
    47             return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    48         }
    49     }
    50 }

    5:InterFace 

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Text;
     4 
     5 namespace ZRF.CRM.InterFaces
     6 {
     7     
     8    public interface ITest002Service
     9     {
    10         string Dowork(string msg);
    11         string DoWork02(string msg);
    12     }
    13 }

    6:Service

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Text;
     4 namespace ZRF.CRM.Service
     5 {
     6     using ZRF.CRM.InterFaces;
     7     using ZRF.CRM.MyAttrobutrs;
     8 
     9     public class Test002Service : ITest002Service
    10     {
    11         [TransactionScopeAsync]
    12         public string Dowork(string msg)
    13         {
    14 
    15             return $"Test002Service:Dowork {DateTime.Now}-{msg}";
    16         }
    17 
    18         public string DoWork02(string msg)
    19         {
    20             return $"Test002Service:DoWork02:{DateTime.Now}-{msg}";
    21         }
    22     }
    23 }

    7:自定义特性,将来判断哪些方法可以aop

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Text;
     4 
     5 namespace ZRF.CRM.MyAttrobutrs
     6 {
     7     [AttributeUsage(AttributeTargets.Method)]
     8     public class TransactionScopeAsyncAttribute : Attribute
     9     {
    10     }
    
    
    下一篇:没有了