【发布时间】: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