【问题标题】:How can I connect to multiple databases from a Blazor .NET Core project?如何从 Blazor .NET Core 项目连接到多个数据库?
【发布时间】:2020-05-30 09:42:34
【问题描述】:

如何从 Blazor WebAssembly 项目连接到多个数据库实例,我还添加了托管的 ASP.NET Core?

我的想法是将DBContexts 启动到“Startup.cs”(来自 Blazor.Server 应用程序,它引用了 Blazor.Client 应用程序):

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<DatabaseContext>(options =>
            options.UseSqlite(
                "connection string holder ..."));
}

像这样,但我想让用户在我的视图中选择是否要对将创建 SQLite 数据库实例的应用程序进行测试运行。常规运行将是 SQL Server 数据库的一个实例。如何在 ConfigureServices 方法中执行此操作?

现在我正在构建DBContexts 类,这些也受影响吗?

控制器还没有完成,ASP.NET Core MVC 控制器是正确的选择吗?

【问题讨论】:

  • blazor 不是 MVC,请勿混合使用 razor 和 blazor (docs.microsoft.com/en-us/aspnet/core/blazor/…)
  • 关于多数据库,和blazor无关,看这个stackoverflow.com/questions/43767933/…
  • Blazor WASM 应用程序中没有多个数据库连接。Blazor WASM 是一个 UI 框架,就像任何前端框架一样。对于 DB 操作,您必须创建一个 Web API 并为多个 DB 连接创建多个 DbContexts。
  • @Rahul 嗯,这就是我对“WebAssembly ASP.NET Core Hosted”所做的意思。我的项目结构现在是 Blazor.Client 、 Blazor.Server 和 Blazor.Shared Lib。所以现在我在服务器项目中有 Startup.cs,我将在其中放置我的控制器。为什么多个数据库连接是不可能的?我还不明白。
  • @maytham-ɯɐɥʇʎɐɯ 我不能在 Blazor.Server 项目中做吗?这是我在创建 WebAssembly 之前检查 ASP.NET Core Hosted 选项时创建的。

标签: c# blazor blazor-server-side


【解决方案1】:

您可以使用 2 个 DB 上下文、一个接口和一个从 API 请求中发送的数据中选择上下文的服务来实现:

数据库上下文接口

public interface IDatabaseContext
{
// add all DbSet declaration here
}

数据库上下文

public class DatabaseContext : IDatabaseContext
{
// db context implementation
}

测试数据库上下文

public class TestDatabaseContext: DatabaseContext
{
// add your constructor
}

DbContext 解析器服务

public class DbContextResolver
{
    public bool IsTest { get; set; }

服务器端 DI 设置

services.AddDbContext<DatabaseContext>(options =>
            options.UseSqlServer(
                "SqlServer connection string holder ..."))
        .AddDbContext<TestDatabaseContext>(options =>
            options.UseSqlite(
                "Sqlite connection string holder ..."))
        .AddScoped<DbContextResolver>())
        .AddScoped<IDatabaseContext>(p =>
        {
            var resolver = p.GetRequiredService<DbContextResolver>();
            if (resolver.IsTest)
            {
                retrun p.GetRequiredService<TestDatabaseContext>();
            }
            return p.GetRequiredService<DatabaseContext>();
        }));

从请求中选择数据库上下文

public void Configure(IApplicationBuilder app)
{
     app.Use((context, next) =>
     {
          var resolver = context.RequestServices.GetRequiredService<DbContextResolver>();
          resolver.IsTest = context.Request.Query.ContainsKey("test"); // here the context is choosed by query string but you can choose to send an header instead
          return next();
     }
}

在控制器或服务中使用选择的数据库上下文

public class MyController : Controller
{
     public MyController(IDatabaseContext context)
...
}

【讨论】:

  • 还不能实现,但是否可以在运行时更改解析器?还有如何更改解析器状态?是否可以通过在 UI 中注入并通过单击按钮设置布尔值来做到这一点?抱歉,我对这个 ASP.NET Core Web 内容有点陌生,想学习。
【解决方案2】:

我没试过,但你可以试试这样的-

在 Blazor 客户端 Program.cs -

builder.Services.AddDatabaseStorage();

在 Blazor 服务器中 Startup.cs -

   public void ConfigureServices(IServiceCollection services)
    {
        services.AddDatabaseStorage();
    }

创建一个静态类并添加所有数据库存储接口及其实现-

public static class StorageServiceCollections
{
    public static IServiceCollection AddDatabaseStorage(this IServiceCollection 
 services)
    {
  //you may also return DB service based on certain condition here. Like factory, singleton pattern.
        return services
            .AddSingleton<IDBStorageService, SQLStorageService>()
            .AddSingleton<IMongoDBStorageService, MongoStorageService>();
    }
}

建立数据库连接及其实现类,例如SQLStorageService, MongoStorageService 这样的东西 -

  public MongoStorageService()
    {
        var client = new MongoClient("mongodb://localhost:23456");
        _mongoDatabase = client.GetDatabase("DB");
    }

注入剃须刀组件来调用它们-

@inject IDBStorageService dbStorage

【讨论】:

    【解决方案3】:

    服务器端 Blazor:

    services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
    services.AddDbContext<ApplicationDbContext>(options => options.UseFirebird(Configuration.GetConnectionString("FirebirdConnection"));
    

    然后注册你的服务:

    services.AddSingleton<SalesService>();
    

    您的服务有一个模型,您可以使用任何连接返回:

    public Task<Sales[]> GetSalesRangeAsync(DateTime StartDate, DateTime EndDate)
    {
        IDbConnection db = new FbConnection(Startup.FirebirdDatabase);
        
        // QUERY
        return Task.FromResult(Enumerable.Range(0, 1).Select(index => new Sales
        {
            // RESULTS
        }).ToArray());
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-27
      • 2021-01-07
      • 2019-06-27
      • 2017-05-18
      • 2017-09-01
      • 2020-04-14
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多