組織内の他の開発チームがMVCアプリケーションを構築するために使用する内部アプリケーションフレームワークを作成しています。その一環として、すべてのビューのメニュー構造を作成しています。これは、構成から読み取られ、現在のユーザーのアクセス許可に基づいて変更されます。フレームワークの一部としてメニューを作成するために、メニューを構築するWebViewPage
ためにに依存する必要があるカスタムHTMLヘルパークラスを使用してカスタム実装を作成しましたApplicationDataReader
。
WebViewPage
MVCにはパラメーターなしのコンストラクターが必要であると説明しているさまざまな投稿を読んだので、プロパティインジェクションを使用する必要があります。Autofac MVC3 Integrationを構成しました。これには、の登録も含まれますViewRegistrationSource
。問題は、依存プロパティにアクセスすると、常にnullになることです。
これが、私が行おうとしている呼び出しのカスタムビューページとヘルパーです。
public abstract class OuBaseViewPage<TModel> : WebViewPage<TModel> where TModel : class
{
public OuHelper<TModel> Ou { get; set; }
public override void InitHelpers()
{
base.InitHelpers();
Ou = new OuHelper<TModel>(ViewContext, this);
}
}
public class OuHelper<TModel> where TModel : class
{
public OuHelper(ViewContext viewContext, IViewDataContainer viewDataContainer)
: this(viewContext, viewDataContainer, RouteTable.Routes)
{
}
public OuHelper(ViewContext viewContext, IViewDataContainer viewDataContainer, RouteCollection routeCollection)
{
ViewContext = viewContext;
ViewData = new ViewDataDictionary<TModel>(viewDataContainer.ViewData);
}
public ViewDataDictionary<TModel> ViewData { get; private set; }
public ViewContext ViewContext { get; private set; }
public IList<BusinessFocusArea> ReadFocusAreas()
{
// this is null - yes, service location, but an isolated instance of...
return DependencyResolver.Current.GetService<IDataReader>().Read();
}
}
InitHelpers
この問題は、が呼び出される前に(を介してLayout.Execute()
)呼び出されているという事実に起因しているApplication_Start
ため、依存関係は登録されていません。ビューにロジックを挿入するのは良い習慣ではなく、ビューは単純に馬鹿げているはずですが、これはアプリケーションフレームワークであり、フレームワークを使用する開発者が可視化してはならない特定のセットアップ手順を実行する必要があります。
私が従うことができるより良いアプローチはありますか?
ここにも同様の問題があります。Autofacは依存関係をレイアウトビューファイルに挿入できますか?