17

レイアウトを使用するすべてのビューで実行する必要がないように、共有レイアウト ビュー ページに依存関係を挿入しようとしています。

ビューに依存関係を挿入するための wikiのガイダンスに従いましたが、プロパティは常に null です。

Autofac は、レイアウト ファイルであるカスタム ビュー ページにプロパティを挿入できますか?

これが私のセットアップです。CustomViewPage

namespace MyApp
{
    using System.Web.Mvc;

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

〜/Views/Shared/_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 から派生しません。

4

5 に答える 5

21

ほとんどのソリューションは、DependencyResolver.Current.GetService 呼び出しの単なるラッパーになるため、レイアウトから直接呼び出す方が簡単な場合があります。

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

また、この方法は、サービス ルーチン/モデルとビジネス ルーチン/モデルの混合を避けることができるため、ページ モデルをより SRP にするのに役立ちます。

于 2014-10-06T19:59:15.467 に答える
0

パラメータのない結果については、データを渡すために WebViewPage を拡張する必要はありません。私はこのように解決します: 1. ActionFilter から派生したクラス HelperActionFilter を宣言し、プロパティhttp://docs.autofac.org/en/latest/integration/mvc.htmlを介してそれにサービスを注入します 2. 内部 HelperActionFilter.OnActionExecuting セットアップViewBag.HasFoo はレイアウトでチェックします。

于 2016-02-25T13:35:28.590 に答える
0

基本的にレイアウトでDIを達成できないのはAutoFacだけではありません。CustomViewPage依存関係を解決するには、IOC コンテナーへの参照が必要になる場合があります。

REALYYY REQUIREDでない限り、ビューで DI を避けるだけです (私の意見です)。

私から見るとメリットはあまり感じられません。ベース ビュー ページ クラスの単体テストを作成するつもりはないと思いますか? 特別な理由がない限り、それを避けてください。コンテナーに依存する代わりに、具体的な実装に依存する方がよいでしょう。

于 2012-07-22T14:33:36.947 に答える