0

让我们假设以下基本项目设置:

- Core
-- Attributes
--- CustomDisplayNameAttribute : DisplayNameAttribute
- UI

UI 代表 MVC Web 界面,核心实现了所有领域的业务对象,包括像CustomDisplayNameAttribute. 该属性包含额外的依赖项,如语言解析器,例如处理后备订单。休眠会话将是另一个可能的依赖项。

在早期的项目中,这些属性会进行全局请求以获取解析器。这是 IMO 丑陋的,应该以不同的方式处理。此外,Core 应该没有HttpContext: 因为每个请求都需要语言解析器,它可能最终出现在HttpContextItems 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]。

4

1 回答 1

0

我认为这是不可能的,因为数据属性不像过滤器那样在运行时调度。因此,没有地方可以拦截创建并注入您正在寻找的内容。

于 2012-08-08T16:25:09.527 回答