FreeSql + .Net6 多库连接实现

时间:2025-03-03 11:11:41

1、安装Nuget包 AutoMapper

2、program.cs里添加如下配置:

 services.AddSingleton(r =>
 {
     var str = configuration.GetConnectionString("MES");
     return new FreeSqlBuilder()
             .UseConnectionString(DataType.SqlServer, str)
             .Build<MESFlag>();
 });

 services.AddSingleton(r =>
 {
     var str = configuration.GetConnectionString("Kingdee");
     return new FreeSqlBuilder()
             .UseConnectionString(DataType.SqlServer, str)
             .Build<KingdeeFlag>();
 });

3、 创建仓储类 ServiceLocator

  public class ServiceLocator
  {
      #region Field

      private static IServiceProvider _instance;

      #endregion

      #region Public Method

      /// <summary>
      /// 设置IServiceProvider
      /// </summary>
      /// <param name="serviceProvider"></param>
      public static void SetProvider(IServiceProvider serviceProvider)
      {
          if (_instance == null)
              _instance = serviceProvider;
      }

      /// <summary>
      /// 获取服务
      /// </summary>
      /// <typeparam name="T"></typeparam>
      /// <returns></returns>
      public static T GetService<T>()
      {
          return _instance.GetService<T>();
      }

      /// <summary>
      /// 获取服务
      /// </summary>
      /// <typeparam name="T"></typeparam>
      /// <returns></returns>
      public static object GetService(Type type)
      {
          return _instance.GetService(type);
      }

      #endregion
  }

4、program.cs里添加如下配置:

 ServiceLocator.SetProvider(services.BuildServiceProvider());

5、创建ServiceBase类

 public abstract class ServiceBase<T> where T : EntityBase, new()
 {
     /// <summary>
     /// 数据库访问对象1
     /// </summary>
     protected IFreeSql<DB1Flag> FreeSql1
     {
         get
         {
             return ServiceLocator.GetService<IFreeSql<DB1Flag>>();
         }
     }

     /// <summary>
     /// 数据库访问对象2
     /// </summary>
     protected IFreeSql<Db2Flag> FreeSql2
     {
         get
         {
             return ServiceLocator.GetService<IFreeSql<Db2Flag>>();
         }
     }
 }

 /// <summary>
 /// 库1
 /// </summary>
 public class DB1Flag
 { }

 /// <summary>
 /// 库2
 /// </summary>
 public class Db2Flag
 { }

6、创建你自己的Service

  public class YourService : ServiceBase<YourEntity>, IYourService
  {
      private readonly ILogger<YourService> _logger;

      public YourService(ILogger<YourService> logger)
      {
          _logger = logger;
      }

      public List<YourDto> GetList(string name)
      {
         
         
          var list = FreeSql1.Select<YourEntity>().Where(x => x.Name == name).ToList();

          // 访问
          var list2 = FreeSql2.Select<YourEntity>().Where(x=>x.Name == name).ToList();  



          // convert to dto... 

          return null;
      }
  }

7、创建Base实体类

public abstract class EntityBase:EntityBase<long>
{

}

/// <summary>
/// 
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class EntityBase <T>
{
    /// <summary>
    /// 主键
    /// </summary>
    [Column(IsPrimary = true)]
    [Description("主键")]
    public virtual T Id { get; set; }

}

8、创建你的实体类

[Table(Name = "Tb_Your")]
public class YourEntity : EntityBase
{
    /// <summary>
    /// 姓名
    /// </summary>
    [Column]
    public string Name { get; set; }

    /// <summary>
    /// 备注
    /// </summary>
    [Column(DbType = "text")]
    public string Remark { get; set; }

    #region 关联对象

    /// <summary>
    /// 子表集合
    /// </summary>
    [Navigate(nameof(YourDetailEntity.ParentId))]
    public List<YourDetailEntity> DetailList { get; set; }

    #endregion

}