Sitecore 7 IoC和Controller Renderings

时间:2015-03-18 09:48:23

标签: asp.net-mvc-5 sitecore inversion-of-control castle-windsor glass-mapper

我在我的SC7项目中使用GlassMapper。它“开箱即用”配置Castle Windsor IoC容器,允许添加自定义配置。我向控制器构造函数添加了一些依赖项,并使用Castle的容器覆盖默认的SitecoreControllerFactory以解决它们。 我将控制器添加为Controller Rendering,但它似乎不起作用。

潜入其中,我意识到默认控制器工厂根本没有被调用,尽管它已正确配置。相反,Sitecore似乎寻找替代管道,调用Sitecore.Mvc.Controllers.ControllerRunner,它使用反射加载控制器并创建它的实例,由于构造函数需要依赖项,因此抛出异常。

这是代码。

初​​始化:

public class Initialize
{
    public void Process(PipelineArgs args)
    {
        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new WebFormViewEngine());
        ViewEngines.Engines.Add(new ThemedRazorEngine());

        GlassMapperSc.Start();

        SetupControllerFactory(args);
    }

    public virtual void SetupControllerFactory(PipelineArgs args)
    {
        var container = Utils.Ioc.Ioc.CurrentContainer;
        if (container == null)
        {
            return;
        }

        var controllerFactory = new WindsorControllerFactory(container);

        var sitecoreControllerFactory = new SitecoreWindsorControllerFactory(controllerFactory);
        ControllerBuilder.Current.SetControllerFactory(sitecoreControllerFactory);
    }
}

Sitecore控制器工厂:

public class SitecoreWindsorControllerFactory : SitecoreControllerFactory
{
    public SitecoreWindsorControllerFactory(IControllerFactory innerFactory) : base(innerFactory)
    {
    }

    protected override IController CreateControllerInstance(RequestContext requestContext, string controllerName)
    {
        return controllerName.EqualsText(SitecoreControllerName) ? CreateSitecoreController(requestContext, controllerName) : InnerFactory.CreateController(requestContext, controllerName);
    }
}

默认控制器工厂:

public class WindsorControllerFactory : DefaultControllerFactory
{
    private const int PageNotFoundStatus = 404;

    private readonly IWindsorContainer _container;

    public WindsorControllerFactory(IWindsorContainer container)
    {
        _container = container;
    }

    public override IController CreateController(RequestContext requestContext, string controllerName)
    {
        // todo: wrap this in the final implementation
        if (!TypeHelper.LooksLikeTypeName(controllerName))
        {
            return base.CreateController(requestContext, controllerName);
        }
        var type = TypeHelper.GetType(controllerName);

        return type != null ? GetControllerInstance(requestContext, type) : null;
    }

    public override void ReleaseController(IController controller)
    {
        _container.Release(controller);
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            // todo: the request context should be wrapped in final implementation.
            throw new HttpException(
                PageNotFoundStatus,
                string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
        }

        return _container.Resolve(controllerType) as IController;
    }
}

控制器:

ublic class LanguagePickerController : Controller
{
    private readonly ISitecoreContext _context;

    public LanguagePickerController()
    {
        _context = Ioc.CurrentContainer.Resolve<ISitecoreContext>();
    }

    public ActionResult LanguagePickerIndex()
    {
        //var context = new SitecoreContext();
        var dataSource = RenderingContext.Current.Rendering.DataSource;
        var model = _context.GetItem<LanguagePicker>(dataSource);

        // ReSharper disable once Mvc.ViewNotResolved
        return View("LanguagePicker",model);
    }
}

您无法在构造函数中看到依赖项,因为现在我正在解析它直接调用容器。

1 个答案:

答案 0 :(得分:0)

嗯,解决方案花了一段时间,但最后我明白了: 我覆盖了5个类:GetControllerRenderer,ControllerRenderer,ControllerRunner,ControllerFactory和SitecoreControllerFactory。

在GetControllerRenderer中,方法GetRenderer调用ControllerRenderer,其中Render调用ControllerRunner。在ControllerRunner中,我重写方法CreateController以绕过Sitecore代码,该代码使用反射加载控制器并使用基于Castle Windsor的新控制器工厂。

相关问题