您可以使用IOC容器将依赖项注入自定义WebViewPage的构造函数中吗?

Ove*_*d D 6 asp.net-mvc dependency-injection inversion-of-control

在MVC 3中,我了解您可以创建自定义WebViewPages.你能使用构造函数注入通过IOC容器注入依赖项吗?

Rem*_*oor 10

Brad Wilson的博客文章中有一个关于视图注入的示例http://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.html

视图中其他视图允许构造函数注入不完全正确.是IDependencyResolver可以创建具有构造函数参数的视图.但除非你实现自己的视图引擎,否则这对你没有任何帮助.像razor这样的现有视图引擎将要求您具有无参数构造函数.这意味着您只能使用它们对视图进行属性注入.

但正如其他人所说,无论如何你都不应该看注射.您的视图应该是愚蠢的,只需将视图模型呈现为HTML.任何需要依赖的东西都应该在控制器或服务中完成.


Noe*_*ams 8

无法执行构造函数注入.但你可以用Ninject做这样的事情:

    public abstract class CustomViewBase<TModel> : WebViewPage<TModel> where TModel : class
    {
        [Inject]
        public IFace Face
        {
            get;
            set;
        }
    }

假设您已在Global.asax中设置了IDependencyResolver,则应正确初始化@Face属性.但是一个重要的警告:你可能无法在_Layout.cshtml中访问@Face,因为(根据Brad Wilson的说法)布局在MVC之外工作,当你尝试在布局页面中访问它时@Face将为null.

无论如何,我同意其他人的意见,认为不应该处理任何复杂的逻辑.


rou*_*uen 5

是的,这是可能的,但我认为这不是一个好主意.为什么在视图级别需要一些"服务"?记住关键的MVC指南 - 视图必须是愚蠢的.实际上,它应该只是用于将视图模型对象转换为HTML的某种模板,仅此而已.

  • 视图中的i18n翻译.视图包含键,您只需提取正确的翻译.没有理由不能在视野中. (7认同)
  • 那些只包含文本的本地化或配置类型服务呢?他们在技术上仍然是愚蠢的 (3认同)