Внедрение зависимостей возвращает ноль для обеих служб, которые мы создаем. Ошибка с ошибкой CS0234: имя типа или пространства имен 'Feature' не существует в пространстве имен 'CCO.Feature.Global.Areas.CCO' (отсутствует ссылка на сборку?). Что вызвало бы это?
Мы преобразуем сайт Sitecore 8.2 в сайт Sitecore 9.1. Это требует использования файлов конфигурации сервиса с использованием инфраструктуры внедрения зависимостей Sitecore и Microsoft. Мы создали файл конфигурации в соответствии с инструкциями службы поддержки Sitecore.
namespace CCO.Feature.Global.Areas.CCO.Controllers
{
public class MetadataController : CcoController
{
[AggregateService]
public interface IDependencies
{
IMetadataService MetadataService { get; set; }
ISitecoreConfigurationManager SitecoreConfigurationManager { get; set; }
}
private readonly MetadataController.IDependencies _dependencies;
public MetadataController(IDependencies dependencies) : base(dependencies?.SitecoreConfigurationManager)
{
_dependencies = dependencies;
}
public virtual ActionResult HtmlPageTitle()
{
var mvcContext = new MvcContext();
var dataSource = mvcContext.GetContextItem<IGlassBase>();
var title = _dependencies.MetadataService.GetHtmlPageTitle(dataSource);
return View(new MvcHtmlString(title));
}
namespace CCO.Feature.Global.Services
{
public class GlobalConfigurator : IServicesConfigurator
{
public void Configure(IServiceCollection serviceCollection)
{
serviceCollection.AddScoped(typeof(MetadataController.IDependencies), typeof(MetadataControllerDependencies));
serviceCollection.AddTransient<MetadataController>();
}
}
}
namespace CCO.Feature.Global.Services
{
public class MetadataControllerDependencies : MetadataController.IDependencies
{
public IMetadataService MetadataService { get; set; }
public ISitecoreConfigurationManager SitecoreConfigurationManager { get; set; }
}
}
namespace CCO.Feature.Global.Services
{
public interface IMetadataService
{
string GetHtmlPageTitle(IGlassBase pageItem);
IPageMetadata GetPageMetadata(IGlassBase pageItem);
string GetCustomHeadHtml(IGlassBase pageItem);
string GetOpenGraphImage(IGlassBase pageItem);
}
}
Мы ожидали, что служба вернет заголовок страницы, но получит сообщение об ошибке. CS0234: имя типа или имени пространственного объекта «Feature» не существует в пространстве имен «CCO.Feature.Global.Areas.CCO» (вы пропустили ссылка на сборку?), которая затем выдает исключение нулевой ссылки при попытке вернуть представление.
Добавлена трассировка стека 6/25/2019
Server Error in '/' Application.
Object reference not set to an instance of an object.
Description: An unhandled exception occurred.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error:
Line 38: var mvcContext = new MvcContext();
Line 39: var dataSource = mvcContext.GetContextItem<IGlassBase>();
Line 40: var title = _dependencies.MetadataService.GetHtmlPageTitle(dataSource);
Line 41:
Line 42: return View(new MvcHtmlString(title));
Source File: D:\Source\cco_website\src\Feature\Global\code\Areas\CCO\Controllers\MetadataController.cs Line: 40
Stack Trace:
[NullReferenceException: Object reference not set to an instance of an object.]
CCO.Feature.Global.Areas.CCO.Controllers.MetadataController.HtmlPageTitle() in D:\Source\cco_website\src\Feature\Global\code\Areas\CCO\Controllers\MetadataController.cs:40
lambda_method(Closure , ControllerBase , Object[] ) +92
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +34
System.Web.Mvc.<>c__DisplayClass24_0.<InvokeActionMethodWithFilters>b__0() +79
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +454
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +454
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +524