让我们假设以下基本项目设置:
- Core
-- Attributes
--- CustomDisplayNameAttribute : DisplayNameAttribute
- UI
UI 代表 MVC Web 界面,核心实现了所有领域的业务对象,包括像CustomDisplayNameAttribute
. 该属性包含额外的依赖项,如语言解析器,例如处理后备订单。休眠会话将是另一个可能的依赖项。
在早期的项目中,这些属性会进行全局请求以获取解析器。这是 IMO 丑陋的,应该以不同的方式处理。此外,Core 应该没有HttpContext
: 因为每个请求都需要语言解析器,它可能最终出现在HttpContext
Items Collection 中。
现在我是Ninject的初学者,我不确定它是否是正确的工具,以便将此类依赖项转化为类似CustomDisplayNameAttribute
?
换句话说,它会是这样的:
HttpContext
如果创建了属性,则使用Items Collection中的语言解析器填充其他语言解析器属性- 如果没有
HttpContext
(例如测试、石英作业等),请从其他地方获取。
感谢任何输入
编辑:示例代码
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]。