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

时间:2011-10-05 02:45:15

标签: asp.net-mvc dependency-injection inversion-of-control

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

3 个答案:

答案 0 :(得分:10)

Brad Wilson http://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.html

在博文中有一个关于视图注入的示例

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

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

答案 1 :(得分: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页。

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

答案 2 :(得分:5)

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