Entity framework 用于EF上下文的WebAPI/Unity截获请求和更改ConctionString Unity容器

Entity framework 用于EF上下文的WebAPI/Unity截获请求和更改ConctionString Unity容器,entity-framework,asp.net-web-api,unity-container,Entity Framework,Asp.net Web Api,Unity Container,我正在构建一个API,每个请求需要连接到不同的数据库。目前我正在使用EF。这些数据库都有相同的模式,因此我可以共享一个DbContext类。我有用于抽象持久性的存储库,这些存储库使用DbContext对象 Unity正在处理依赖项解析,它正在向我的存储库注入DbContext对象和控制器上的repo。基本上是零配置。我知道我可能需要按照中的建议创建自己的HttpRequestLifeCycle,以确保在整个请求中都有相同的DbContext对象 现在,我想配置一个ConnectionString

我正在构建一个API,每个请求需要连接到不同的数据库。目前我正在使用EF。这些数据库都有相同的模式,因此我可以共享一个DbContext类。我有用于抽象持久性的存储库,这些存储库使用DbContext对象

Unity正在处理依赖项解析,它正在向我的存储库注入DbContext对象和控制器上的repo。基本上是零配置。我知道我可能需要按照中的建议创建自己的HttpRequestLifeCycle,以确保在整个请求中都有相同的DbContext对象

现在,我想配置一个ConnectionString,以便Unity在创建DbContext对象传递到存储库时使用

这些ConnectionString将基于我路由上的一个参数来自存储库(很可能是另一个固定数据库)。因此,我的目的是让一个用户检查路由,获取参数,获取ConnectionString并告诉Unity:“在这个请求期间,当为我的存储库创建DbContext对象时,请使用这个特定的连接字符串。”

首先,我的方法合理吗?这是可以实现的吗? 这个动态参数配置是如何完成的


提前感谢,

是的,这是合理的,可以实现的,坦率地说,很简单

用不同的方法处理这个问题,而不是考虑如何注入连接字符串,只需为您的db上下文注册一个工厂。在factory方法中,使用路由信息读取连接字符串并返回上下文

containe.Register<MyDbContext>( new InjectionFactory( 
  c => {
     // this is the factory method
     // the code will be executed upon each resolution

     String routeInfo = GetTenantFromCurrentRoute();

     String cs = GetCsFor( routeInfo );

     return new MyDbContext( cs );

  }, new PerHttpRequestLifetimeManager() )
containe.Register(新注入工厂(
c=>{
//这是工厂法
//代码将在每次解决时执行
字符串routeInfo=GetTenantFromCurrentRoute();
字符串cs=GetCsFor(routeInfo);
返回新的MyDbContext(cs);
},新的PerHttpRequestLifetimeManager())