.NetCode6 Autofac的使用和日志拦截器的配置

第一步 
先下载关于Autofac的使用  <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="6.0.0" />  这里是6.0 的Netget包 直接引进程序集即可

第二部 创建一个.cs的类然后写方法  

//重写Autofac管道Load方法
        protected override void Load(ContainerBuilder builder1)
        {
            //程序集注入业务服务
            var IAppSerVice = Assembly.Load("Smarthealthcare.Service");
            var AppSerVice = Assembly.Load("Smarthealthcare.Service");
            //    builder1.RegisterAssemblyTypes(Assembly.LoadFrom("Smarthealthcare.Service")).AsImplementedInterfaces();
            // builder1.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces();
            //根据名称约定(服务层)(服务层的接口和实现均以Service结尾),实现服务接口和服务实现的依赖
            builder1.RegisterAssemblyTypes(IAppSerVice, AppSerVice).Where(x => x.Name.EndsWith("SerVice")).AsImplementedInterfaces().EnableInterfaceInterceptors();//

EnableInterfaceInterceptors//用于启用接口拦截器

        }


注:在程序集注入服务中 引入你的程序集名称   例:Smarthealthcare.Service 就是我的程序集名称 

然后再 把EndsWith里面的SerVice改为你定义的Service即可

第三步 在Program配置AUtofac

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()).ConfigureContainer<ContainerBuilder>(builder =>
{
 

builder.RegisterType<LogInterceptor>();//是用于注册日志拦截器的代码
    builder.RegisterModule(new AutofacModuleRegister()); 在Autofac里面注册方法

//注册泛型基本仓储实现
   builder.RegisterGeneric(typeof(Repository<,>)).As(typeof(IRepository<,>)).InstancePerDependency();
   builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerDependency();
});

日志拦截器配置

using Castle.DynamicProxy;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
using Newtonsoft.Json;
using Smarthealthcare.Domain.Healthcare;
using Smarthealthcare.Dto;
using SqlSugar;
using System.Runtime.InteropServices;
 
namespace Smarthealthcare.Service
{
    public class LogInterceptor : IInterceptor
    {
 
        private readonly ISqlSugarClient sqlSugar;
        private readonly IHttpContextAccessor http;
 
 
        public LogInterceptor(ISqlSugarClient sqlSugar, IHttpContextAccessor http)
        {
            this.sqlSugar = sqlSugar;
            this.http = http;
        }
 
        public void Intercept(IInvocation invocation)
        {
 
 
 
            // 非异步方法直接执行
            invocation.Proceed();
            var t = invocation.ReturnValue;
            #region 拿到浏览器参数和操作系统
            OperatingSystem os = Environment.OSVersion;
            var UrlData = os.Platform;
            string osName = string.Empty;
 
            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                osName = "Windows";
            }
            else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
            {
                osName = "Linux";
            }
            else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
            {
                osName = "macOS";
            }
            else
            {
                osName = "Unknown";
            }
 
            var urli = osName;
            var ServicePack = os.ServicePack;
            var p = http.HttpContext.Request.GetEncodedUrl();
            #endregion
 
            var resultProperty = invocation.ReturnValue.GetType().GetProperty("Result")?.GetValue(invocation.ReturnValue);
            if (invocation.Method.Name == "GetLoginUser")
            {
                #region 登录日志
                SmartLoginLog smartLogin = new SmartLoginLog();
                //请求方法参数
                var list = JsonConvert.SerializeObject(resultProperty).ToString();
                var response = JsonConvert.DeserializeObject<ApiResponseDto>(list);
                if (response.Data == null)
                {
                    smartLogin.LoginUserName = "";
                }
                else
                {
                    smartLogin.LoginUserName = response.Data.User_Name;
 
                }
                smartLogin.LoginRequestService = invocation.TargetType.FullName;
                smartLogin.LoginMethodName = invocation.Method.Name;
                smartLogin.LoginHttpType = http.HttpContext.Request.Method;
                var parameters = invocation.Method.GetParameters();
                var arguments = invocation.Arguments;
                List<string> parameterStrings = new List<string>();
 
                for (int i = 0; i < parameters.Length; i++)
                {
 
                    var parameterName = JsonConvert.SerializeObject(parameters[i].Name);
                    var argumentValue = JsonConvert.SerializeObject(arguments[i]);
 
                    parameterStrings.Add(parameterName + ":" + argumentValue);
                }
 
                var result = string.Join(",", parameterStrings);
                //请求参数
                smartLogin.LoginHttpRequestParms = result.ToString();
                smartLogin.LoginResultData = JsonConvert.SerializeObject(resultProperty).ToString();
                smartLogin.RequestTime = DateTime.Now;
                smartLogin.LoMessage = response.Message;
                sqlSugar.Insertable(smartLogin).ExecuteReturnSnowflakeId();//单条插入返回雪花ID
                #endregion
            }
            else
            {
                #region 操作日志
                SmartLogest smartLog = new SmartLogest();
                //请求方法参数
                smartLog.RequestService = invocation.TargetType.FullName;
                //请求人名称
                //smartLog.ResultData = 
                smartLog.RequestUserName = http.HttpContext.User.Identity.Name;
                smartLog.HttpType = http.HttpContext.Request.Method;
                smartLog.ResultData = JsonConvert.SerializeObject(resultProperty).ToString();
                //请求方法名称
                smartLog.MethodName = invocation.Method.Name;
 
                if (http.HttpContext.User?.Identity?.IsAuthenticated == true)
                {
                    var claims = http.HttpContext.User.Identities.First().Claims.ToList();
 
                    if (claims.Count >= 3)
                    {
                        smartLog.RequestRoleName = claims[2].Value;
                        //其他逻辑...
                    }
                    else
                    {
                        //处理索引超出范围的错误情况
                    }
                }
                else
                {
                    //处理用户未进行身份认证的情况
                }
                //请求参数方法
                var parameters = invocation.Method.GetParameters();
                var arguments = invocation.Arguments;
                List<string> parameterStrings = new List<string>();
 
                for (int i = 0; i < parameters.Length; i++)
                {
                    var parameterName = JsonConvert.SerializeObject(parameters[i].Name);
                    var argumentValue = JsonConvert.SerializeObject(arguments[i]);
 
                    parameterStrings.Add(parameterName + ":" + argumentValue);
                }
 
                var result = string.Join(",", parameterStrings);
                //请求参数
                smartLog.HttpRequestParms = result.ToString();
                //请求时间
                smartLog.RequestTime = DateTime.Now;
                //添加日志记录
                sqlSugar.Insertable(smartLog).ExecuteReturnSnowflakeId();//单条插入返回雪花ID
 
                #endregion
            }
 
        }
 
 
    }
}
注:这里我已经写完 复制替换即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值