我有一个案例,每个客户都有自己的数据库 - 我想要做的是自动发生这种情况,例如当Autofac创建控制器时,它会查找clientId,然后获取连接字符串
以下获取字符串
public class ModuleContextProvider : IModuleContextProvider
{
IModuleContext context;
public IModuleContext GetContext(int moduleId)
{
if ( context == null)
{
//get module.
var rep = DependencyResolver.Current.GetService<IModuleRepository>();
var module = rep.GetById(moduleId);
context = GetContext(module);
}
return context;
}
public IModuleContext GetContext(Model.Module module)
{
if ( context == null)
{
//get module.
var rep = DependencyResolver.Current.GetService<IModuleRepository>();
context = new ModuleContext(module.DBConnection);
if ( context == null)
throw new InvalidOperationException("Could nto create DB COntext" );
}
return context;
}
}
但我怎么把它带进控制器所以每个人都不需要每次都担心它,我有以下但很明显要创建repositry我需要上下文。
public CategoryController(ICommandBus commandBus, ICategoryRepository categoryRepository)
{
this.commandBus = commandBus;
this.categoryRepository = categoryRepository;
}
是否可以使用ROute,例如// Controller / ModuleId / Method,然后以某种方式从Url获取此内容?
提前感谢您的帮助。
编辑:我认为真正的问题是如何继续推动连接字符串(在这种情况下以模块的形式)。
答案 0 :(得分:0)
您可能希望了解如何使用IDbContextFactory。
http://msdn.microsoft.com/en-us/library/hh506876(v=vs.103).aspx
what is the best practice to set up DbContext in StructureMap for console app?
它已添加到EF 4.1 Update 1中。
不确定这是否会对您的问题有所帮助,但无论哪种方式都很有用。
答案 1 :(得分:0)
如果有人需要这个..
我将它存储在cookie中并在控制器中检索如下
IModuleWorldRepository moduleWorldRepository;
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
moduleWorldRepository = GetModuleWorldRepository();
}
IModuleWorldRepository GetModuleWorldRepository()
{
UserRunTimeInfo user = (UserRunTimeInfo)User.Identity;
var context = contextProvider.GetContext(user.CurrentModuleId);
return new ModuleWorldRepository(context);
}