我有使用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,因为我现在不想用户登录。
所以问题是,如何以最佳方式实现传递当前记录的用户设置,而不使用服务位置?
答案 0 :(得分:1)
假设我正确理解了问题,像单身模式这样的东西可以提供帮助(参见http://en.wikipedia.org/wiki/Singleton_pattern)。
一个单身人士会存储信息并在要求时提供。其他组件只需要知道如何访问单例,而不是更具体的。
为了将单个用户设置从单例中取出,将键(如用户ID)映射到值的字典类型的数据结构可能是好的。
答案 1 :(得分:1)
我会使用单独的数据库进行所有身份验证,然后从该数据库中提取用户特定的数据库设置。
使用检索到的用户特定设置,我将创建要注入ORM连接过程的类,并使用构造函数或属性注入注入它。