【问题标题】: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();
}
}