2

我对 IoC 容器比较陌生,所以我提前为我的无知道歉。

我的应用程序是一个 asp.net 4.0 MVC 应用程序,它使用实体框架和一个存储库层。它是一个多租户应用程序,因此使用的连接字符串因登录的客户端而异。

连接字符串由作为指示客户端的路由的一部分传入的“键”确定。此路由数据仅在用户会话的第一个请求中出现。

路线看起来像这样:http://{host}/login/dev/

其中“dev”表示我们正在使用开发数据库。

目前,IoC 容器正在 global.asax Application_Start 事件处理程序中注册所有依赖项,并且我将“密钥”硬编码如下:

var cnString = CommonServices.GetDBConnection("dev");
container.RegisterType<IRequestMgmtRecipientRepository, RequestMgmtRecipientRepository>(
        new InjectionConstructor(cnString));

Unity 有没有办法使用最初提供的路由数据根据登录的客户端动态注册存储库?

注意:我不是手动解析存储库。当控制器被实例化时,它们由容器构造。我难住了。

谢谢!

4

1 回答 1

0

快速假设,您可以使用主机来识别您的租户。

以下文章的方法略有不同http://www.agileatwork.com/bolt-on-multi-tenancy-in-asp-net-mvc-with-unity-and-nhibernate-part-ii-commingled-data/,它使用NH,但它是可用的。

基于上述,这个被黑的代码可能会起作用(没有尝试/遵守以下内容,不是很多统一用户,更多的是温莎人:))

Container.RegisterType<IRequestMgmtRecipientRepository, RequestMgmtRecipientRepository>(new InjectionFactory(c =>
{
    //the following you can get via a static class
    //HttpContext.Current.Request.Url.Host, if i remember correctly
    var context = c.Resolve<HttpContextBase>();
    var host = context.Request.Headers["Host"] ?? context.Request.Url.Host;

    var connStr = CommonServices.GetDBConnection("dev_" + host); //assumed
    return new RequestMgmtRecipientRepository(connStr);
}));

场景2(我不认为是这种情况)

如果客户端识别租户(不是主机,即 http://host1),这表明您已经需要访问数据库才能访问客户端信息?在这种情况下,保存客户信息的数据库也需要有足够的信息来识别租户。

senario 2 的问题将围绕匿名使用出现,即正在访问哪个租户。

假设 senario 2,那么 InjectionFactory 应该仍然可以工作。

希望这可以帮助

于 2013-07-22T03:35:44.173 回答