промежуточное ПО .net core 3 или атрибут авторизации? и как? - PullRequest
0 голосов
/ 03 октября 2019

Я нахожусь на

  • .net Core 3.0 web api
  • токен JWT / owin
  • EF Core 3

У меня есть проект с несколькими базами данных. Пользователь выбирает базу данных из списка, в форме входа. После этого я установил dbName / connectionString в утверждении «selectedDb»

В каждом контроллере у меня есть от 8 до 20 классов (менеджер), которым нужен DbContext в качестве параметра contructor => я не могу создать istance менеджеров илиdbContext в конструкторе контроллера, потому что у меня еще нет токена для входа!

Так, чтобы в каждом действии я создавал istance dbContext (токена, предоставляющего строку соединения) и istance менеджеров ... Но это означает, что янужно «копировать / вставлять» одну и ту же строку кода 3/4 в каждом действии

как я могу предоставить действительный экземпляр контекста БД? возможно, используя промежуточное программное обеспечение или пользовательский атрибут авторизации

Есть ли способ создать экземпляр dbcontext в конструкторе контроллера? (с «динамической строкой соединения», предоставленной из токена)

Некоторые примеры кода

Функция классов инициализации (избегайте копирования 16 и 3 # 92 строк каждый раз)

private DatabaseContext InitContextAndManager(string connectionString)
{
    _dbContext = new DatabaseContext(connectionString);

    _someManager1 = new SomeManager_1(_dbContext);
    _someManager2 = new SomeManager_2(_dbContext);
    _someManager3 = new SomeManager_3(_dbContext);
    _someManager4 = new SomeManager_4(_dbContext);
    _someManager5 = new SomeManager_5(_dbContext);
    _someManager6 = new SomeManager_6(_dbContext);
    _someManager7 = new SomeManager_7(_dbContext);
    _someManager8 = new SomeManager_8(_dbContext);
    _someManager9 = new SomeManager_9(_dbContext);
    _someManager10 = new SomeManager_10(_dbContext);
    _someManager11 = new SomeManager_11(_dbContext);
    _someManager12 = new SomeManager_12(_dbContext);
    _someManager13 = new SomeManager_13(_dbContext);
    _someManager14 = new SomeManager_14(_dbContext);
    _someManager15 = new SomeManager_15(_dbContext);
}

НекоторыеПример API

[Authorize]
public ActionResult Api_1()
{
    var connectionString = User.Identity.GetConnectionString();
    InitContextAndManager(connectionString);

    //some api_1 stuff
}

[Authorize]
public ActionResult Api_2()
{
    var connectionString = User.Identity.GetConnectionString();
    InitContextAndManager(connectionString);

    //some api_2 stuff
}

[Authorize]
public ActionResult Api_3()
{
    var connectionString = User.Identity.GetConnectionString();
    InitContextAndManager(connectionString);

    //some api_3 stuff
}

1 Ответ

0 голосов
/ 04 октября 2019

С помощью @Ruard van Elburg и Его Ответ

здесь решение

public ControllerConstructor(DbConnectionInfo db)
{
    _databaseContext = db.DbContext;
    _someManager1 = new SomeManager(_dbcontext);
}
public class DbConnectionInfo
{
    public DatabaseContext DbContext { get; set; }

    public DbConnectionInfo(IHttpContextAccessor httpContextAccessor)
    {
        var user = httpContextAccessor.HttpContext.User;
        //for question example
        DbContext = new DatabaseContext(user.Identity.GetConnectionString);
    }
}
[Authorize]
public ActionResult Api_1()
{
    //some api_1 stuff
}
...