MVC DisplayNameAttribute和Ninject:可能吗?

时间:2012-08-08 15:47:16

标签: asp.net-mvc asp.net-mvc-4 ninject ninject-2 ninject.web.mvc

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

- 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]。

1 个答案:

答案 0 :(得分:0)

我不认为这是可能的,因为数据属性不像过滤器那样是运行时调度的。因此,没有地方可以拦截创作并注入你想要的东西。