2

MVC4 Web アプリで使用しているカスタム ViewEngine があります。

私は現在、次のGlobal.asaxように登録しています:

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CustomViewEngine());

私のCustomViewEngineクラスには、私の IOC 実装 (CastleWindsor を使用) を通じて利用できるクラスのプロパティがあります。

現時点では、windsor リゾルバーに直接アクセスしてCustomViewEngine解決することができましたが、本当にやりたいことは、windsor によって ViewEngine を解決し、それらすべてのビットを無料で取得することです。明示的に行う必要はありません。

これは可能ですか?ViewEngine を WebRequest ごとに解決したいと思います。

4

2 に答える 2

2

このようなものはどうですか?

    public class DependencyViewEngine : RazorViewEngine
    {
        public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
        {
            var result = base.FindPartialView(controllerContext, partialViewName, useCache);
            result.ViewEngine = // resolve view engine
            return result;
        }

        public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        {
            var result = base.FindView(controllerContext, viewName, masterName, useCache);
            result.ViewEngine = // resolve view engine
            return result;
        }

    }

それで

    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new DependencyViewEngine());

編集:

コンテナーを使用するために依存関係リゾルバーを実装するのはどうですか?

public class CustomDependencyResolver : IDependencyResolver
{
    public CustomDependencyResolver(IContainer container)
    {
       // ...
    }

    public object GetService(Type serviceType)
    {
        // pass resolution off to your container
    }
    public IEnumerable<object> GetServices(Type serviceType)
    {
        // pass resolution off to your container
    }
}

それで

protected void Application_Start()
{
   ViewEngines.Engines.Clear();
   var resolver = new CustomDependencyResolver(container);
   DependencyResolver.SetResolver(resolver);
}
于 2012-09-12T03:53:27.247 に答える
0

IDependencyResolverから派生したカスタムのdependecyリゾルバーサービスを使用する必要があります。MVCは、IViewEngineインターフェイスを解決するときに、IDependencyResolver.GetServicesメソッドを呼び出します。また、このメソッドによって返されるサービスがない場合、MVCは従来のAPI(ViewEngines.Engines)を呼び出します。また、この方法で返されるサービスは複数あります(競争力のあるマルチサービスモデルです)。非常にまれなケースですが、まだ存在しています。したがって、カスタムエンジンを使用してIViewEngineインターフェイスを実装し、それをコンテナに登録して、カスタムIDependencyResolver実装を使用するだけです。

于 2012-09-13T08:26:47.797 に答える