我正在构建一个需要根据请求连接到不同数据库的API。目前我正在使用EF。这些数据库都具有相同的模式,因此我可以共享一个DbContext类。我有抽象持久性的存储库,这些是使用DbContext对象的。
Unity正在处理依赖项解析,它使用DbContext对象注入我的存储库,并在控制器上注入存储库。基本上零配置。据我所知,我可能需要按this answer中的建议创建自己的HttpRequestLifeCycle,以确保我在整个请求中拥有相同的DbContext对象。
现在,我想在创建DbContext对象以传递给存储库时配置Unity使用的ConnectionString。
这些ConnectionString将来自一个存储库(很可能是一个不同的固定数据库),基于我的路由上的参数。因此,我的目的是让delegating handler检查路由,获取参数,获取ConnectionString并告诉Unity:“这里,在此请求期间为我的存储库创建DbContext对象时使用此特定连接字符串。”
首先,我的方法合理吗?这可以实现吗? 这个动态参数配置将如何完成?
提前致谢,
答案 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() )