私は、サービスをプロパティ(ロギングサービスを想定)がMVC3プロジェクト内にあるカスタムWebViewPage
でWindsorのIDependencyResolver
実装を使用しています。誰が_Layout.cshtmlを作成していますか
サービスはすべてのビューに挿入されます(作成はIDependencyResolver
を通過します)。
問題は、_Layout.cshtml(レイアウト)ではサービスがnullのままであることです。
だから、それはIDependencyResolver
で作成されていないので、誰がレイアウトを作成しているのですか?
編集:その後、
public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>
{
public ILocalizer Localizer { get; set; }
}
からweb.configファイルの両方のsystem.web.webPages.razorとのsystem.webセクション〜で
<pages pageBaseType="[full namespace].WebViewPage">
/ビュー 、最終的に依存関係リゾルバ:
public class WindsorDependencyResolver : IDependencyResolver
{
private readonly IKernel kernel;
public WindsorDependencyResolver(IKernel kernel)
{
this.kernel = kernel;
}
public object GetService(Type serviceType)
{
return kernel.HasComponent(serviceType) ? kernel.Resolve(serviceType) : RegisterAndResolve(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return kernel.HasComponent(serviceType) ? kernel.ResolveAll(serviceType).Cast<object>() : new object[] { };
}
private object RegisterAndResolve(Type serviceType)
{
if (!serviceType.IsAbstract && !serviceType.IsInterface)
{
kernel.Register(Component.For(serviceType).ImplementedBy(serviceType).LifestylePerWebRequest());
return kernel.Resolve(serviceType);
}
return null;
}
}
依存リゾルバはGlobal.asax.csに設定されている:
var dependencyResolver = new WindsorDependencyResolver(container.Kernel);
DependencyResolver.SetResolver(dependencyResolver);
任意のビューがインスタンス化されるとき(Index.cshtmlは)依存リゾルバからのgetServiceメソッドが呼び出され、ビューはコンテナによって作成されます。 _Layout.cshtmlの場合、そのメソッドは呼び出されません。
だから私はIndex.cshtmlでこれを行うとき:@Localizer.Localize(....)
localizaerサービスがnullではないですが、_Layout.cshtmlで、それはnull
で、具体的な問題は、私はビューに何をローカライズすることはできません(と私は望んでいないことサポートされているロケールごとに表示する)。
私はそれが今より明らかに希望です。
編集:私はMVCのソースをチェックする時間を持っていなかったが、答えは確かに存在している必要があり、この1 ... に まだ明確な答え...
なぜあなたはあなたの見解であなたのサービスを手に入れようとしていますか? – Hammerstein
より良い例は、ある種のローカリゼーションサービスです。 – Padel
私は同じ問題に遭遇しています。これを理解することに運がありましたか? – BrooklynDev