【问题标题】:Dependency Injection and user specific data依赖注入和用户特定数据
【发布时间】:2011-09-22 09:51:07
【问题描述】:

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

要创建 NH 会话,我们需要传递某个地方:用户名、数据库名称等。所以我已经实现了:

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,因为我现在不会登录用户。

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

【问题讨论】:

  • 我认为你的意思是一种魅力,而不是一种伤害,尽管 ninject 这个名字的暴力来源:-)

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


【解决方案1】:

假设我正确理解了这个问题,像单例模式这样的东西可能会有所帮助(请参阅http://en.wikipedia.org/wiki/Singleton_pattern)。

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

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

【讨论】:

  • 在玩过那个 Singleton 之后介绍了 Service Location,但是是的 - 这是一些解决方案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-08-22
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2021-11-19
    • 1970-01-01
    • 2021-05-15
    相关资源
    最近更新 更多