2012-07-21 26 views
13

我試圖在共享佈局視圖頁面中注入一個依賴項,以避免在使用佈局的每個視圖中都這樣做。Autofac可以將依賴關係注入到佈局視圖文件中嗎?

我已經按照Wiki中的guidance注入依賴到視圖中,但該屬性始終爲空。

Autofac可以將屬性注入到作爲佈局文件的自定義視圖頁面中嗎?

這是我的設置。 CustomViewPage

namespace MyApp 
{ 
    using System.Web.Mvc; 

    public abstract class CustomViewPage : WebViewPage 
    { 
     public IHelper Helper { get; set; } 
    } 
} 

〜/查看/共享/ _Layout.cshtml

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

全球註冊...

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)); 

使用佈局切勿從派生的 「子」 的看法CustomViewPage。

+3

看來這是Autofac的[已知問題](http://code.google.com/p/autofac/issues/detail?id=349)... – nemesv 2012-07-21 16:01:33

+0

是的問題在這裏http:// code .google.com/p/autofac/issues/detail?id = 349 – GraemeMiller 2013-01-29 11:24:34

+1

這個答案適用於我作爲一個解決方法:http://stackoverflow.com/a/14935006/789683 – flipchart 2013-09-12 05:26:53

回答

1

這不僅與AutoFac基本上你不能在佈局中實現DI。您可能需要參考CustomViewPage中的IOC容器來解決依賴關係。

除非它是REALYYY REQUIRED只是避免DI在意見(只是我的意見)。

從我的角度來看,我沒有看到太多的好處。我認爲你不會爲基礎視圖頁面類編寫單元測試嗎?除非有特別的理由才避免。而不是依賴於容器,最好是具有具體實現的依賴關係。

+3

任何形式的參考或背景,爲什麼你可以'DI DI進入佈局? – Josh 2012-07-22 22:37:29

+0

@Josh如上所述,這是我的看法和許多其他人,我從來沒有說過你不能只是說這可能不是最好的主意......有幾個原因爲什麼不這樣做,這將很難進行單元測試,具體取決於您隨身攜帶的IoC庫需要訪問HttpContext來解析容器,並且您可能最終處於您的視圖直接與服務對話的情況下,從而制動MVC模式。它取決於每個人他們如何做的事情,我並不是說你不可能只是想讓你重新考慮設計,並確保沒有更好的選擇 – 2017-02-06 03:25:52

+0

@Joe_DM你可以請你發佈你的編輯作爲一個新的答案? – VJAI 2017-02-06 06:05:34

0

這裏有一點工作可以與大多數DI框架一起工作。

首先調整你CustomPageView一點點:

public abstract class CustomViewPage : WebViewPage 
{ 
    public IHelper Helper { 
     get { return ViewData[Helper.ViewDataKey] as IHelper; }  
    } 

} 

現在也需要得到扶養到您的ViewData,引入屬性做到這一點:

public sealed class HelperAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     var viewResult = filterContext.Result as ViewResult; 
     if (viewResult != null) 
      viewResult.ViewData.Add(Helper.ViewDataKey, GetHelperFromIoC()); 

     base.OnResultExecuting(filterContext); 
    } 
} 

在你的操作方法或控制器:

[Helper] 
public ActionResult Index() 
{ 
    return View(); 
} 

而在你看來,你現在應該可以使用你的助手作爲expec特德:

@Helper.HelloWorld() 

請參閱this blog原始帖子。

15

大多數解決方案都將只是圍繞DependencyResolver.Current.GetService調用的包裝,所以它可能更容易直接從佈局調用它:

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

而且這樣有助於使頁面模型更加SRP,因爲可以避免混合服務例程/模型和商業例程。

0

對於沒有參數的結果,您不需要擴展WebViewPage以將數據傳遞給。 我會解決這個問題是這樣的: 1.聲明從ActionFilter派生的類HelperActionFilter,通過屬性注入你的服務,它http://docs.autofac.org/en/latest/integration/mvc.html 2.內部HelperActionFilter.OnActionExecuting設置ViewBag.HasFoo檢查佈局。

0

只需創建部分頁面並將其插入到頁面佈局:

@Html.Partial("_MyPartialPage"); 

依賴注入部分頁面。

相關問題