ASP.NET MVC 3或4 - 如何处理许多DB

时间:2011-12-21 16:13:27

标签: c# asp.net-mvc entity-framework autofac

我有一个案例,每个客户都有自己的数据库 - 我想要做的是自动发生这种情况,例如当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获​​取此内容?

提前感谢您的帮助。

编辑:我认为真正的问题是如何继续推动连接字符串(在这种情况下以模块的形式)。

2 个答案:

答案 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);

    }