Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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#-在身份验证后更改DbContext ConnectionString_C#_Database_Entity Framework - Fatal编程技术网

C#-在身份验证后更改DbContext ConnectionString

C#-在身份验证后更改DbContext ConnectionString,c#,database,entity-framework,C#,Database,Entity Framework,我正在尝试创建一个应用程序,根据经过身份验证的用户更改DbConnection字符串 因此,在用户登录后,我必须获得该用户,查看类似“connectionName”的字段,并在我的app.config上查找该connectionString以连接到我的数据库 我已经知道如何设置依赖项注入以传递构造函数参数,但是如何让登录用户访问依赖项注入项目 像这样的 这是一个名为“Project.Infra”的项目 DBContext public class MyDbContext : DbContext

我正在尝试创建一个应用程序,根据经过身份验证的用户更改DbConnection字符串

因此,在用户登录后,我必须获得该用户,查看类似“connectionName”的字段,并在我的app.config上查找该connectionString以连接到我的数据库

我已经知道如何设置依赖项注入以传递构造函数参数,但是如何让登录用户访问依赖项注入项目

像这样的

这是一个名为“Project.Infra”的项目

DBContext

public class MyDbContext : DbContext
{
    //ConnectionStringBasedOnUserLogged will be a propertie on my userModel
    //so I have to get the logged user before have it.
    public MyDbContext(string ConnectionStringBasedOnUserLogged)
        : base(ConnectionStringBasedOnUserLogged)
    {
        Configuration.ProxyCreationEnabled = false;
        Configuration.LazyLoadingEnabled = false;
    }

    //DbSets...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    //Mappings...
    }
}
这是一个名为“Project.Infra”的项目

存储库

public class MyRepository : IMyRepository
{
    private MyDbContext _ctx;

    public MyRepository(MyDbContextcontext)
    {
        this._ctx = context;
    }

    //Implementation of interface...
}
这是在一个名为“Project.Api”的项目中

控制器

public class MyController : ApiController
{
    private IMyRepository _repo;

    public MyController(IMyRepository repo)
    {
        this._repo = repo;
    }
    //Implementation
}
这是在一个名为“Project.Startup”的项目中

依赖注射

public static class DependencyResolver
{
    public static void Resolve(UnityContainer container)
    {
        //How do I get here some details about the logged user at my application ?
        container.RegisterType<MyDbContext, MyDbContext>(new HierarchicalLifetimeManager(), new InjectionConstructor("HereWillComeTheConnection"));
        container.RegisterType<IMyRepository, MyRepository>(new HierarchicalLifetimeManager());        }
}
公共静态类依赖解析程序
{
公共静态无效解析(UnityContainer容器)
{
//如何在这里获得有关我的应用程序中已登录用户的详细信息?
RegisterType(新层次结构CallifeTimeManager(),新注入构造函数(“HereWillComeTheConnection”);
container.RegisterType(新层次结构CallifetimeManager());}
}

为什么不使用工厂模式。创建一个DbContextFactory,该工厂将能够基于经过身份验证的用户使用适当的连接字符串创建DbContext。同意Nkosi。然后我想您可以插入
DbContextFactory
而不是
DbContext
。我已经尝试过了,但是我无法通过“user.Identity”访问我的用户数据。。。我必须缓存我的信息或类似的东西。为什么不使用工厂模式呢。创建一个DbContextFactory,该工厂将能够基于经过身份验证的用户使用适当的连接字符串创建DbContext。同意Nkosi。然后我想您可以插入
DbContextFactory
而不是
DbContext
。我已经尝试过了,但是我无法通过“user.Identity”访问我的用户数据。。。我必须缓存我的信息或类似的东西。