Autofac可以将依赖项注入布局视图文件吗?

Jos*_*osh 13 asp.net-mvc dependency-injection autofac asp.net-mvc-4

我正在尝试将依赖项注入共享布局视图页面,以避免在使用布局的每个视图中执行此操作.

我已经按照wiki中的指导将注入依赖项注入到视图中,但该属性始终为null.

Autofac可以将属性注入到作为布局文件的自定义视图页面中吗?

这是我的设置.CustomViewPage

namespace MyApp
{
    using System.Web.Mvc;

    public abstract class CustomViewPage : WebViewPage
    {
        public IHelper Helper { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

〜/查看/共享/ _Layout.cshtml

@inherits MyApp.CustomViewPage
<!DOCTYPE html>
<html>
...
@if(this.Helper.HasFoo()){@Html.ActionLink("Bar")}
Run Code Online (Sandbox Code Playgroud)

全球注册......

builder.RegisterType<Helper>().AsImplementedInterfaces();
builder.RegisterModelBinderProvider();
builder.RegisterFilterProvider();
builder.RegisterModule(new AutofacWebTypesModule());
builder.RegisterSource(new ViewRegistrationSource());
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
Run Code Online (Sandbox Code Playgroud)

使用布局的"子"视图不是从CustomViewPage派生的.

Sta*_*tan 16

大多数解决方案只是DependencyResolver.Current.GetService调用的包装器,所以直接从布局调用它可能更容易:

@{
    var helper = DependencyResolver.Current.GetService<IHelper>();
}
...
@if (helper.HasFoo()) { @Html.ActionLink("Bar") }
...
Run Code Online (Sandbox Code Playgroud)

这种方式也有助于使页面模型更加SRP,因为可以避免混合服务例程/模型和业务.


VJA*_*JAI 0

不仅使用 AutoFac 基本上无法在布局中实现 DI。您可能需要对 IOC 容器的引用来CustomViewPage解决依赖关系。

除非确实需要,否则就避免在视图中使用 DI(只是我的意见)。

从我的角度来看,我没有看到太多好处。我认为您不会为基本视图页面类编写单元测试,是吗?除非有什么特殊原因,否则就避免它。与其依赖容器,不如依赖具体实现。

  • 有任何类型的参考或背景说明为什么您不能 DI 进入布局吗? (3认同)