【问题标题】:Castle Windser implementation issue in Sitecore 8.1 MVC projectSitecore 8.1 MVC 项目中的 Castle Windser 实施问题
【发布时间】:2016-02-02 19:52:01
【问题描述】:

我将在 Sitecore 8.1 MVC 项目中实现 Castle Windsor DI。在网站级别,我还创建了接口、类和存储库。我浏览了各种文章,但没有找到直接的方法。 控制器部分如下:

public class CommonController : Controller
{
    private readonly ICommon _service;
    public CommonController(ICommon commonService)
    {
        this._service = commonService;
    }
    public ActionResult GetProductDetail()
    {
        var CommonModel = _service.GetProductDetail();
        return View(CommonModel);
    }
}

浏览时出现以下错误:

Server Error in '/' Application.

No parameterless constructor defined for this object. 

我知道仍然需要实现 DI 部分。

我已经通过以下文章的解决方案:Using Castle Windsor with Sitecore MVC for Dependency Injection

但现在出现以下错误:

给定的键不在字典中。说明:发生未处理的异常。

有什么建议吗?

【问题讨论】:

  • 请发布堆栈跟踪

标签: dependency-injection sitecore castle-windsor sitecore-mvc sitecore8.1


【解决方案1】:

文章告诉你如何配置windsor。但它没有告诉你的是你必须配置你的容器。

为了让 windsor 能够解析您的 ICommon commonService,您需要告诉它必须如何解决。

有几种方法可以做到这一点。以下只是我如何在一个项目中使用它的一个示例。

希望对你有帮助。

汉斯

public class WebInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Component.For(typeof(ICommon)).ImplementedBy(typeof(CommonService)).LifestyleTransient());

    }
}

public static class DependencyInjection
{
    private static IWindsorContainer container;
    private static readonly object padlock = new object();

    public static IWindsorContainer Container
    {
        get
        {
            lock (padlock)
            {
                if (container == null)
                {
                    InitializeDependencyInjection();
                }

                return container;
            }
        }
    }

    private static void InitializeDependencyInjection()
    {
        container = new WindsorContainer();
        container.AddFacility<FactorySupportFacility>();
        container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel));

        container.Install(new Core.Installers.WebInstaller());

        // Wiring up DI for the SOLR integration
        //new WindsorSolrStartUp(container).Initialize();
    }

    /// <summary>
    ///     http://www.superstarcoders.com/blogs/posts/using-castle-windsor-with-sitecore-mvc-for-dependency-injection.aspx
    /// </summary>
    public static void SetupControllerFactory()
    {
        Container.Install(FromAssembly.This());

        // Transient needed for sitecore running multiple instances of a controller for controller renderings
        Container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient());

        IControllerFactory controllerFactory = new WindsorControllerFactory(Container);

        var scapiSitecoreControllerFactory = new SitecoreControllerFactory(controllerFactory);

        ControllerBuilder.Current.SetControllerFactory(scapiSitecoreControllerFactory);
    }
}

public class InitializeWindsorControllerFactory
{
    public virtual void Process(PipelineArgs args)
    {
        DependencyInjection.SetupControllerFactory();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多