2016-04-16 1 views
5

Я пытаюсь Подайте зависимость в контроллер, который наследует от RenderMvcController Umbraco и получать ошибкуИспользования Simple Инжектора с Umbraco контроллером

«Нет регистрацию для типа RenderMvcController не может быть найдена и неявная регистрация не может быть Для того чтобы контейнер мог создавать RenderMvcController, он должен иметь только один публичный конструктор: он имеет 3. См. https://simpleinjector.org/one-constructor для получения дополнительной информации. "

Ниже мой код для проволоки до DI

 var container = new Container(); 
     container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 

     InitializeContainer(container); 

     container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 

     container.Verify(); 

     DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 



    private static void InitializeContainer(Container container) 
    { 
     container.Register<ICacheProvider, CacheProvider>(Lifestyle.Transient); 
     container.Register<ICacheService, CacheService>(Lifestyle.Transient); 
    } 

Это является примером класса, получающего зависимость, он наследует от базового класса я написал

public class NewsroomController : BaseRenderMvcController 
{ 
    public NewsroomController(ICacheService cacheService) : base(cacheService) { } 

Базовый класс расширяет RenderMvcController который является Umbraco контроллер

public class BaseRenderMvcController : RenderMvcController 
{ 
    public ICacheService CacheService { get; set; } 
    public BaseRenderMvcController(ICacheService cacheService) 
    { 
     CacheService = cacheService; 
    } 
} 

Как вы можете видеть базовую Umbraco Contro Мюллер ли на самом деле имеет 3 различных конструкторы

public class RenderMvcController : UmbracoController, IRenderMvcController, IRenderController, IController 
{ 
    public RenderMvcController(); 
    public RenderMvcController(UmbracoContext umbracoContext); 
    public RenderMvcController(UmbracoContext umbracoContext, UmbracoHelper umbracoHelper); 

Я не уверен, как получить SimpleInjector чтобы красиво разместить с этим контроллером, унаследованным от Umbraco.

Заранее благодарен!

+0

Итак, этот «RenderMvcController» является базовым классом и не предназначен для прямого вызова пользователем, как в 'http: // mysite/rendermvc'? Кто определил этот «RenderMvcController»? Вы или являетесь частью другой библиотеки (например, самого Умбрако)? – Steven

+0

Да, RenderMvcController - это контроллер, который сам Umbraco предоставляет, он там унаследован. –

+0

Вот почему я сделал BaseRenderMvcController, так что у меня есть база, которую я могу контролировать, но моя база все еще должна унаследовать от RenderMvcController, чтобы сохранить Umbraco счастливым. –

ответ

5

Сообщение об исключении «Никакая регистрация для типа RenderMvcController не может быть найдена и неявная регистрация не может быть выполнена» означает, что тип RenderMvcController запрашивается непосредственно из Simple Injector, в то время как он не был зарегистрирован. Тип контроллера обычно запрашивается только DefaultControllerFactory, и он запрашивает только определенный тип, когда получает запрос с именем контроллера в своем URL-адресе, например: http:\\localhost\RenderMvc\3.

Поскольку вы указали в комментариях, что RenderMvcController предназначен только для использования в качестве базового контроллера, я нахожу подозрительным, что он действительно запрашивается MVC. Я думаю, вы должны изучить это.

Но использование этого контроллера действительно требуется, вы можете просто зарегистрировать его в простом Injector, как это:

container.Register<RenderMvcController>(() => new RenderMvcController()); 

Есть способы переопределить Simple инжектора constructor resolution behavior, но я бы не советовал делать это, потому что это anti-pattern for components to have multiple constructors. Целесообразно не проводить автоматическое проводку контейнера по типам фреймов (как описано here), поэтому регистрация их с использованием лямбда - это рекомендуемая практика.

+2

Это устранило мою проблему, хотя я получил сообщение об ошибке, что он реализует IDisposable, поэтому мне пришлось сделать это container.Register (() => новый RenderMvcController(), Lifestyle.Scoped); –

+0

Также я рассмотрел то, что вы сказали. Хотя мне нужно наследовать от контроллера, чтобы переопределить любые пользовательские маршруты, я думаю, Umbaco будет использовать этот экземпляр контроллера для всех неявных маршрутов, и именно поэтому его вызывали в первую очередь. Большое спасибо за вашу помощь и спасибо за разработку библиотеки в первую очередь! –