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 派生的自定义依赖解析器服务。MVC 在解析 IViewEngine 接口时调用 IDependencyResolver.GetServices 方法。如果这个方法没有返回任何服务,MVC会调用传统的API(ViewEngines.Engines)。此外,这种方法返回的服务不止一个(它是具有竞争力的多服务模型)。尽管这种情况非常罕见,但它仍然存在。因此,只需使用您的自定义引擎实现 IViewEngine 接口,将其注册到您的容器中并使用自定义 IDependencyResolver 实现。

于 2012-09-13T08:26:47.797 回答