Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .net core 3中间件还是授权属性?那怎么做呢?_C#_Asp.net_.net Core_Middleware_Jwt Auth - Fatal编程技术网

C# .net core 3中间件还是授权属性?那怎么做呢?

C# .net core 3中间件还是授权属性?那怎么做呢?,c#,asp.net,.net-core,middleware,jwt-auth,C#,Asp.net,.net Core,Middleware,Jwt Auth,我在 .net核心3.0 web api 令牌jwt/owin EF核心3 我有一个多数据库项目。用户在登录表单中从列表中选择数据库。之后,我在“selectedDb”声明中设置dbName/connectionString 在每个控制器中,我都有8到20个需要DbContext作为参数constructor=>的类(manager),我无法在控制器构造函数中创建manager或DbContext的距离,因为我还没有登录令牌 因此,在每个操作中,我都会创建dbContext(token-pr

我在

  • .net核心3.0 web api
  • 令牌jwt/owin
  • EF核心3
我有一个多数据库项目。用户在登录表单中从列表中选择数据库。之后,我在“selectedDb”声明中设置dbName/connectionString

在每个控制器中,我都有8到20个需要DbContext作为参数constructor=>的类(manager),我无法在控制器构造函数中创建manager或DbContext的距离,因为我还没有登录令牌

因此,在每个操作中,我都会创建dbContext(token-provide-connection-string)和managers-istance的距离。。。但这意味着我必须在每次操作中“复制/粘贴”相同的3/4行代码

如何提供db上下文的有效实例?可能使用中间件或自定义授权属性

有没有办法在控制器构造函数中创建dbcontext的实例?(使用令牌提供的“动态连接字符串”)

一些代码示例

Init classes函数(避免每次复制16&3#92行)

一些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
}

在@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
}

可能重复的请看我的答案。在DbConnectionInfo中,您可以访问声明并设置connectionstring。对不起,我不明白您的意思@RuardvanElburg@RuardvanElburgNET核心支持依赖项注入(DI)软件设计模式,这是一种实现类及其依赖项之间控制反转(IoC)的技术。从。在该模式中,您不创建对象(new关键字),而是注入它们。我的答案基于DI。SomeManager应该被注入控制器中,例如,
公共MyController(SomeManager SomeManager)
。SomeManager的构造函数是:
publicsomemanager(SomeContext-SomeContext)
,其中SomeContext构造函数是:
publicsomecontext(DbConnectionInfo)
。如果配置正确,DI会自动解析最后一个类。如果您收到一个错误,那么可能是因为某个服务没有添加到DI,所以无法解决该问题。有了DI,就不需要
new
关键字了。可以使用
新建
创建DTO,但不能使用服务。在Api_1中:
\u someManager1.DoSomething()某些管理器1只能存在于控制器1和3中,某些管理器2/3存在于控制器1 2 4 5中
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
}