让我们假设以下基本项目设置:
- Core
-- Attributes
--- CustomDisplayNameAttribute : DisplayNameAttribute
- UI
UI代表MVC Web界面,核心实现所有域业务对象,包括自编写的属性,如CustomDisplayNameAttribute
。该属性包含其他依赖项,例如语言解析器,例如,处理后备订单。 Hibernate会话将是另一种可能的依赖。
在早期项目中,这些属性执行全局请求以获取解析程序。这是IMO丑陋的,应该以不同的方式处理。此外,Core应该没有HttpContext
:因为每个请求都需要语言解析器,所以它可能会在HttpContext
项集合中结束。
现在我是 Ninject 的初学者,我不确定它是否是正确的工具,以便将这种依赖关系变成CustomDisplayNameAttribute
之类的东西?
用语言来说就是这样:
HttpContext
Items Collection HttpContext
(例如测试,石英作业等),请从其他地方获取。任何输入的Thx
修改:示例代码
namespace Core.Attributes
{
public class CustomDisplayNameAttribute : DisplayNameAttribute
{
private string textCode;
/// <param name="textCode">According to this Text-Code, we will load
/// and resolve the text.</param>
public DeimosDisplayNameAttribute(string textCode)
{
this.textCode = textCode;
}
/// <summary>
/// Load and resolve Text according to Text-Code
/// </summary>
public override string DisplayName
{
get
{
// Load - Ooops: First global access
// --> How can it be injected with IoC?
TextbausteinRepository repo = Root.GetTextBausteinRepository();
var textItem = repo.GetText(textCode);
// Resolve - Ooops: Second global access
// --> How can it be injected with IoC?
TextResolver resolver = Root.GetTextResolver();
return resolver.resolve(textItem);
}
}
}
}
编辑2:在这种情况下,似乎无法绕过全局访问,例如注册表模式或类似模式。 UI将在那里注册所需的数据,属性将从那里访问它。我们开始考虑将它存储在ThreadLocal<T>
中,但由于在生命周期中存在交换线程的可能性,这似乎并没有真正节省。所以似乎无法将HttpContext
存储在注册表层中。有关此主题的更多信息,请参阅[Cup(Of T)] [1]。
答案 0 :(得分:0)
我不认为这是可能的,因为数据属性不像过滤器那样是运行时调度的。因此,没有地方可以拦截创作并注入你想要的东西。