public static void AddFreeSql(this IServiceCollection service) { var freeSql = service.BuildServiceProvider().GetRequiredService <IOptions <FreeSqlConfig> >().Value; //注入FreeSql service.AddSingleton <IFreeSql>(f => { var log = f.GetRequiredService <ILogger <IFreeSql> >(); var freeBuilder = new FreeSqlBuilder() .UseAutoSyncStructure(true) .UseConnectionString(freeSql.DataType, freeSql.MasterConnetion) .UseLazyLoading(true) .UseMonitorCommand( executing => { //执行中打印日志 log.LogInformation(executing.CommandText); } // null, //(executed, t) => //{ // //执行后打印日志 // log.LogWarning(t); //} ) .UseCache(null); if (freeSql.SlaveConnections?.Count > 0)//判断是否存在从库 { freeBuilder.UseSlave(freeSql.SlaveConnections.Select(x => x.ConnectionString).ToArray()); } var freesql = freeBuilder.Build(); //我这里禁用了导航属性联级插入的功能 freesql.SetDbContextOptions(opt => opt.EnableAddOrUpdateNavigateList = false); return(freesql); }); //注入Uow service.AddScoped <IRepositoryUnitOfWork>(f => f.GetRequiredService <IFreeSql>().CreateUnitOfWork()); //注入HttpContextAccessor 可以从IOC中拿到HttpContext的内容 service.AddHttpContextAccessor(); service.TryAddSingleton <IActionContextAccessor, ActionContextAccessor>(); //注入当前用户 利用了缓存查询当前用户信息 service.AddScoped <CurrentUser>(f => f.GetRequiredService <IHttpContextAccessor>().HttpContext?.User?.GetCurrentUser(f)); //使用类库Scrutor做发现注入类库和服务 service.AddServer(typeof(IRepKey)); service.AddServer(typeof(IDomainBase)); //Automapper和配置模板 注入 service.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); }
/// <summary> /// 直接从配置文件读取配置 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="service"></param> public static void CreateFreeSql <T>(this IServiceCollection service) { service.AddSingleton(f => { var current = f.GetService <FreeSqlCollectionConfig>().FreeSqlConfigs?.FirstOrDefault(x => x.Key == typeof(T).Name) ?? throw new ArgumentNullException(nameof(FreeSqlCollectionConfig), $"appSettings.json文件未检测到{typeof(T).Name}对象"); var builder = new FreeSqlBuilder() .UseConnectionString(current.DataType, current.MasterConnection) .UseAutoSyncStructure(current.IsSyncStructure); if (current.SlaveConnections.Count > 0) { builder.UseSlave(current.SlaveConnections.ToArray()); } var res = builder.Build <T>(); res.Aop.CurdAfter += (s, e) => Aop_CurdAfter(s, e, f.GetService <ILogger <IFreeSql <T> > >()); res.Aop.AuditValue += (s, e) => Aop_Auditer(s, e, f); res.GlobalFilter.Apply <IDeleted>(SysConsts.DELETED_FILTER, x => !x.IsDeleted); res.GlobalFilter.Apply <IEnabled>(SysConsts.ENABLED_FILTER, x => x.Enabled == true); return(res); }); service.AddScoped <IUnitOfWork <T>, UnitOfWork <T> >(); }
public static void AddSimpleFreeSql(this IServiceCollection service) { var thisFontColor = (int)Console.ForegroundColor; var newFontColor = (ConsoleColor)((thisFontColor + 1) > 15 ? 0 : (thisFontColor + 1)); if (service == null) { throw new ArgumentNullException(nameof(service)); } var freeSql = service.BuildServiceProvider().GetRequiredService <IOptions <FreeSqlCollectionConfig> >().Value; var config = freeSql.FreeSqlCollections.Where(it => it.Key == "IHRSystem").FirstOrDefault(); if (config == null) { throw new ArgumentNullException(nameof(config)); } //注入FreeSql service.AddScoped(f => { var log = f.GetRequiredService <ILogger <IFreeSql> >(); var freeBuilder = new FreeSqlBuilder() .UseAutoSyncStructure(false) .UseConnectionString(config.DataType, config.MasterConnetion) .UseLazyLoading(true) .UseMonitorCommand(aop => { //Console.ForegroundColor = newFontColor; //Console.WriteLine("=================================================================================\n"); //Console.WriteLine(aop.CommandText + "\n"); string parametersValue = ""; for (int i = 0; i < aop.Parameters.Count; i++) { parametersValue += $"{aop.Parameters[i].ParameterName}:{aop.Parameters[i].Value}" + ";\n"; } if (!string.IsNullOrWhiteSpace(parametersValue)) { //Console.WriteLine(parametersValue); log.LogInformation ( "\n=================================================================================\n\n" + aop.CommandText + "\n\n" + parametersValue + "\n=================================================================================\n\n" ); } log.LogInformation ( "\n=================================================================================\n\n" + aop.CommandText + "\n\n=================================================================================\n" ); //Console.WriteLine("=================================================================================\n"); //Console.ForegroundColor = (ConsoleColor)thisFontColor; }); if (config.SlaveConnections?.Count > 0)//判断是否存在从库 { freeBuilder.UseSlave(config.SlaveConnections.Select(x => x.ConnectionString).ToArray()); } var freesql = freeBuilder.Build(); //我这里禁用了导航属性联级插入的功能 freesql.SetDbContextOptions(opt => opt.EnableAddOrUpdateNavigateList = false); return(freesql); }); //注入Uow service.AddScoped(f => f.GetRequiredService <IFreeSql>().CreateUnitOfWork()); }
/// <summary> /// 直接从配置文件读取配置 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="service"></param> public static void AddFreeSql <T>(this IServiceCollection service) { //var thisFontColor = (int)Console.ForegroundColor; //var newFontColor = (ConsoleColor)((thisFontColor + 1) > 15 ? 0 : (thisFontColor + 1)); service.AddSingleton(f => { var log = f.GetRequiredService <ILogger <IFreeSql> >(); var current = f.GetRequiredService <IOptions <FreeSqlCollectionConfig> >().Value.FreeSqlCollections.FirstOrDefault(x => x.Key == typeof(T).Name); var builder = new FreeSqlBuilder() .UseConnectionString(current.DataType, current.MasterConnetion) .UseAutoSyncStructure(current.IsSyncStructure) .UseMonitorCommand(executing => { executing.CommandTimeout = current.CommandTimeout; if (current.DebugShowSql) { //Console.ForegroundColor = newFontColor; //Console.WriteLine("\n=================================================================================\n"); //Console.WriteLine(executed.CommandText + "\n"); string parametersValue = ""; if (current.DebugShowSqlPparameters) { for (int i = 0; i < executing.Parameters.Count; i++) { parametersValue += $"{executing.Parameters[i].ParameterName}:{executing.Parameters[i].Value}" + ";\n"; } } if (!string.IsNullOrWhiteSpace(parametersValue)) { //Console.WriteLine(parametersValue); log.LogDebug ( "\n=================================================================================\n\n" + executing.CommandText + "\n\n" + "\n" + parametersValue + "\n=================================================================================\n\n" ); } else { log.LogDebug ( "\n=================================================================================\n\n" + executing.CommandText + "\n\n=================================================================================\n" ); } //Console.WriteLine("=================================================================================\n"); //Console.ResetColor(); } }); if (current.SlaveConnections.Count > 0)//判断是否存在从库 { builder.UseSlave(current.SlaveConnections.Select(x => x.ConnectionString).ToArray()); } var res = builder.Build <T>(); #region //使用FreeSql AOP做对应的业务拓展,有需要自行实现 //res.GlobalFilter.Apply<IDeleted>(SysConsts.IsDeletedDataFilter, x => !x.IsDeleted); //res.GlobalFilter.Apply<IEnabled>(SysConsts.IsEnabledDataFilter, x => x.Enabled == true); //res.Aop.ConfigEntity += new EventHandler<ConfigEntityEventArgs>((_, e) => //{ // var attrs = e.EntityType.GetCustomAttributes(typeof(IndexAttribute), false); // foreach (var attr in attrs) // { // var temp = attr as IndexAttribute; // e.ModifyIndexResult.Add(new FreeSql.DataAnnotations.IndexAttribute(temp.Name, temp.Fields, temp.IsUnique)); // } //}); #endregion //使用FreeSql AOP做对应的业务拓展,有需要自行实现 return(res); }); service.AddScoped <IUnitOfWork <T>, UnitOfWork <T> >(); }