Как я могу подключиться к нескольким базам данных из проекта Blazor. NET Core? - PullRequest
0 голосов
/ 30 мая 2020

Как мне подключиться к нескольким экземплярам базы данных из проекта Blazor WebAssembly, в который я также добавил размещенное ядро ​​ASP. NET?

Моя мысль заключалась в том, чтобы запустить DBContexts в Startup.cs (из приложения Blazor.Server, которое имеет ссылку на приложение Blazor.Client):

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

как это, но я хочу, чтобы пользователь мог выбрать в моем представлении, хочет ли он выполнить тестовый запуск приложения, в котором будет создан экземпляр базы данных SQLite. Обычный запуск будет экземпляром для SQL базы данных сервера. Как я могу сделать это в методе ConfigureServices?

Прямо сейчас я создаю классы DBContexts, это тоже происходит?

Контроллеры еще не готовы, это ASP. NET Core MVC контроллеры правильный выбор?

Ответы [ 2 ]

2 голосов
/ 02 июня 2020

Вы можете реализовать это, используя 2 контекста БД, один интерфейс и службу, выбирающую контекст из данных, отправленных в запросах 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)
...
}
0 голосов
/ 30 мая 2020

Я не пробовал, но вы можете попробовать что-то вроде этого -

В клиенте Blazor Program.cs -

builder.Services.AddDatabaseStorage();

На сервере Blazor Startup.cs -

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

Создайте класс stati c и добавьте все интерфейсы хранилища БД и их реализации -

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>();
    }
}

Stabli sh Соединения с БД и их классы реализации, например, SQLStorageService, MongoStorageService Что-то вот так -

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

Вставить в компоненты бритвы для их вызова -

@inject IDBStorageService dbStorage
...