用于EF上下文的Web API / Unity拦截请求和更改连接字符串Unity容器

时间:2015-02-26 20:12:04

标签: entity-framework asp.net-web-api unity-container

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

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

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

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

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

提前致谢,

1 个答案:

答案 0 :(得分:2)

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

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

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