我通常会避免在您的代码中使用staticness 和空值检查 - 默认情况下创建没有单例接线的普通类,并通过容器将该方面分层。同上,消除对属性注入的依赖 - ctor 注入总是更好,除非你别无选择
即:
class TemplateManager
{
readonly IRepository<Template> _templateRepository;
public TemplateManager(IRepository<Template> templateRepository)
{
_templateRepository = templateRepository;
}
public ITemplate LoadRoot()
{
return _templateRepository.Retrieve(1); // obviously better logic here.
}
}
class TemplateModule : Module
{
public void Load()
{
Bind<ITemplate>().ToMethod(() => kernel.Get<TemplateManager>().LoadRoot()).InSingletonScope();
}
}
然后我会质疑 TemplateManager 是否应该成为 ninject 提供程序或内联。
至于实际问题...最大的问题是,如果您决定缓存应该在会话级别而不是应用级别,由于授权影响,您如何以及何时控制清除缓存以强制重新加载模板树?一般来说,我会说这应该是实际类的关注点,而不是绑定到您的 DI 接线或硬连线到一个类是静态类还是单例类(如在设计模式中,而不是 ninject Scope)。
我的倾向是拥有一个没有静态方法的 TemplateManager 类,并将其作为容器中的单例类。但是,要获取根模板,消费者应该注入 TemplateManager(通过 ctor 注入),然后说 _templateManager.GetRootTemplate() 来获取模板。
这样,您可以:
- 不依赖花哨的 ninject 提供程序和/或将自己绑定到您的容器
- 没有单例或静态方法
- 在
TemplateManager中有简单的缓存逻辑
- 在不更改所有客户端代码的情况下更改管理器的范围
- 明确获取模板可能是也可能不是简单的获取操作
也就是说,我会这样管理它:
class TemplateManager
{
readonly IRepository<Template> _templateRepository;
public TemplateManager(IRepository<Template> templateRepository)
{
_templateRepository = templateRepository;
}
ITemplate _cachedRootTemplate;
ITemplate FetchRootTemplate()
{
if(_cachedRootTemplate==null)
_cachedRootTemplate = LoadRootTemplate();
return _cachedRootTemplate;
}
ITemplate LoadRoot()
{
return _templateRepository.Retrieve(1); // obviously better logic here.
}
}
像这样注册它:
class TemplateModule : Module
{
public void Load()
{
Bind<TemplateManager>().ToSelf().InSingletonScope();
}
}
然后像这样消费它:
class TemplateConsumer
{
readonly TemplateManager _templateManager;
public TemplateConsumer(TemplateManager templateManager)
{
_templateManager = templateManager;
}
void DoStuff()
{
var rootTempalte = _templateManager.FetchRootTemplate();
猜测:我还考虑在容器中没有可解析的单独 IRepository(并且
大概与工作单元有各种联系)。相反,我会让 TemplateRepository 成为一个寿命更长的东西,而不是与 ORM 层和工作单元耦合。 IOW 拥有一个存储库和一个管理器,它们都没有自己做任何明确定义的事情,这不是一个好兆头 - 存储库不应该只是一个表数据网关 - 它应该能够成为诸如模板之类的聚合根被缓存的地方并整理在一起。但是在没有上下文的情况下抛出类似的东西之前,我必须更多地了解你的代码库!