Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

多个 IFreeSql 实例,如何注入使用? #44

Closed
2881099 opened this issue Apr 28, 2019 · 3 comments
Closed

多个 IFreeSql 实例,如何注入使用? #44

2881099 opened this issue Apr 28, 2019 · 3 comments
Labels
docs This is a document

Comments

@2881099
Copy link
Collaborator

2881099 commented Apr 28, 2019

第一种方法:定义多个 IFreeSql

1、定义两个标识类:

class MySqlFlag {}
class SqlServerFlag {}

2、在 Startup.cs 中单例注入

public void ConfigureServices(IServiceCollection services)
{
    var fsql1 = new FreeSqlBuilder().UseConnectionString(DataType.MySql, "str1")
        .Build<MySqlFlag>();
    var fsql2 = new FreeSqlBuilder().UseConnectionString(DataType.MySql, "str1")
        .Build<SqlServerFlag>();

    services.AddSingleton<IFreeSql<MySqlFlag>>(fsql1);
    services.AddSingleton<IFreeSql<SqlServerFlag>>(fsql2);
}

3、在 Controller 中使用

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    public ValuesController(IFreeSql<MySqlFlag> mysql, IFreeSql<SqlServerFlag> sqlserver)
    {
    }
}

第二种方法:使用 FreeSql.Clound(推荐)

为 FreeSql 提供跨数据库访问,分布式事务TCC、SAGA解决方案,支持 .NET Core 2.1+, .NET Framework 4.0+.

开源地址:https://github.com/2881099/FreeSql.Cloud

dotnet add package FreeSql.Cloud

or

Install-Package FreeSql.Cloud

public enum DbEnum { db1, db2, db3 }

var fsql = new FreeSqlCloud<DbEnum>(); //提示:泛型可以传入 string
fsql.DistributeTrace = log => Console.WriteLine(log.Split('\n')[0].Trim());

fsql.Register(DbEnum.db1, () => new FreeSqlBuilder()
    .UseConnectionString(DataType.Sqlite, @"Data Source=db1.db")
    .Build());

fsql.Register(DbEnum.db2, () => new FreeSqlBuilder()
    .UseConnectionString(DataType.Sqlite, @"Data Source=db2.db")
    .Build());

fsql.Register(DbEnum.db3, () => new FreeSqlBuilder()
    .UseConnectionString(DataType.Sqlite, @"Data Source=db3.db")
    .Build());

FreeSqlCloud 必须定义成单例模式

new FreeSqlCloud<DbEnum>() 多连接管理

new FreeSqlCloud<DbEnum>("myapp") 开启 TCC/SAGA 事务生效

FreeSqlCloud 的访问方式和 IFreeSql 一样:

fsql.Select<T>();
fsql.Insert<T>();
fsql.Update<T>();
fsql.Delete<T>();

//...

切换数据库:

fsql.Change(DbEnum.db3).Select<T>();
//同一线程,或异步await 后续 fsql.Select/Insert/Update/Delete 操作是 db3

fsql.Use(DbEnum.db3).Select<T>();
//单次有效

自动定向数据库配置:

//对 fsql.CRUD 方法名 + 实体类型 进行拦截,自动定向到对应的数据库,达到自动 Change 切换数据库目的
fsql.EntitySteering = (_, e) =>
{
    switch (e.MethodName)
    {
        case "Select":
            if (e.EntityType == typeof(T))
            {
                //查询 T 自动定向 db3
                e.DBKey = DbEnum.db3;
            }
            else if (e.DBKey == DbEnum.db1)
            {
                //此处像不像读写分离?
                var dbkeyIndex = new Random().Next(0, e.AvailableDBKeys.Length);
                e.DBKey = e.AvailableDBKeys[dbkeyIndex]; //重新定向到其他 db
            }
            break;
        case "Insert":
        case "Update":
        case "Delete":
        case "InsertOrUpdate":
            break;
    }
};
@Lc3586
Copy link

Lc3586 commented Aug 13, 2020

image
NNuGet安装Library.FreeSql;
使用说明:
image

@dotnetcore dotnetcore deleted a comment from EzrealJ Aug 13, 2020
@luoyunchong luoyunchong added the docs This is a document label May 27, 2021
@weiyan2012
Copy link

weiyan2012 commented Jan 25, 2022

  public void ConfigureServices(IServiceCollection services)
  {
      var fsql1 = new FreeSqlBuilder().UseConnectionString(DataType.MySql, "str1")
          .Build<MySqlFlag>();
      var fsql2 = new FreeSqlBuilder().UseConnectionString(DataType.MySql, "str1")
          .Build<SqlServerFlag>();
  
      services.AddSingleton<IFreeSql<MySqlFlag>>(fsql1);
      services.AddSingleton<IFreeSql<SqlServerFlag>>(fsql2);
  }

通过定义标识类的方式来注册多个FreeSql的实例,在本地开发是可用的,为什么部署在服务器上就无法使用?

@hd2y
Copy link
Contributor

hd2y commented Feb 18, 2022

增加了一种基于配置的注入方式,可以参考:#1033

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
docs This is a document
Projects
None yet
Development

No branches or pull requests

5 participants