依赖注入和用户特定数据

时间:2011-06-24 23:12:14

标签: design-patterns architecture dependency-injection inversion-of-control multi-tenant

我有使用ORM的应用程序(Nhibernate,但事实并非如此)。

要创建NH Session,我们需要传递一个地方:用户名,数据库名等等。所以我实现了:

public interface ISettingsManager
{
    Settings MySettings {get;set;}
}

public class Settings
{
    public string DbUser{get;set;}
    public string DbAddress {get;set;}
    public string DbPassword{get;set;}
    //...
}

public class SessionProvider
{
    [Inject]
    public ISettingsManager MySettings {get;set;}

    public Session CreateSession
    {
        //Create Session object using settings passed do MySettings via IoC.
    }
}

public static Main()
{
    // very beggining of my application, bootstrap the DI container
    Bind<ISettingsManager>().To<SettingsManagerImpl>();
    // Application run
}

我所有的NHibernate Session Providers都通过DI(Ninject)向它注入ISettingsManager,所以我可以简单地使用它。它就像一个伤害,但现在我需要支持我的应用程序中的许多用户,问题进入现场。我不能在应用程序启动时绑定我的ISettingsManager,因为我现在不想用户登录。

所以问题是,如何以最佳方式实现传递当前记录的用户设置,而不使用服务位置?

2 个答案:

答案 0 :(得分:1)

假设我正确理解了问题,像单身模式这样的东西可以提供帮助(参见http://en.wikipedia.org/wiki/Singleton_pattern)。

一个单身人士会存储信息并在要求时提供。其他组件只需要知道如何访问单例,而不是更具体的。

为了将单个用户设置从单例中取出,将键(如用户ID)映射到值的字典类型的数据结构可能是好的。

答案 1 :(得分:1)

我会使用单独的数据库进行所有身份验证,然后从该数据库中提取用户特定的数据库设置。

使用检索到的用户特定设置,我将创建要注入ORM连接过程的类,并使用构造函数或属性注入注入它。