WebAPI/Unity 拦截请求并更改 EF 上下文的 ConectionString Unity 容器

WebAPI/Unity Intercept Request and Change ConectionString Unity Container for EF Context

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

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

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

这些 ConnectionString 将基于我的路线上的参数来自存储库(很可能是不同的固定数据库)。所以,我的意图是让 delegating handler 检查路由、获取参数、获取 ConnectionString 并告诉 Unity:"here, use this particular connection string when creating DbContext objects for my repositories during this request."

首先,我的做法合理吗?这是可以实现的吗? 这个动态参数配置是怎么做的?

提前致谢,

是的,这是合理且可以实现的,坦率地说,很容易。

只是采用不同的方法,而不是考虑如何注入连接字符串,只需为您的数据库上下文注册一个工厂。在工厂方法中,使用路由信息读取连接字符串和return上下文。

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