使用简单的注入器和Umbraco控制器

我正在尝试将依赖项注入到一个控制器中,该控制器inheritance自Umbraco的RenderMvcController并获取错误

无法注册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(Lifestyle.Transient); container.Register(Lifestyle.Transient); } 

这是接收依赖的类的一个例子,它inheritance自我写的基类

 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控制器实际上有3个不同的构造函数

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

我不知道如何让SimpleInjector很好地放置从Umbracoinheritance的这个控制器。

提前致谢!

exception消息“无法注册RenderMvcController类型并且无法进行隐式注册”意味着直接从Simple Injector请求RenderMvcController类型,但尚未注册。 控制器类型通常仅由DefaultControllerFactory请求,并且只有在获取其url中具有控制器名称的请求时才会请求特定类型,如: http:\\localhost\RenderMvc\3

由于您在评论中声明RenderMvcController仅用作基本控制器,因此我发现它确实是MVC实际请求的。 我想你应该研究一下。

但它真的需要使用这个控制器,你可以简单地在Simple Injector中注册它,如下所示:

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

有一些方法可以覆盖Simple Injector的构造函数解析行为 ,但我建议不要这样做,因为它是具有多个构造函数的组件的反模式 。 明智的做法是不要在框架类型上使用容器的自动布线行为(如此处所述),因此建议使用lambda注册它们。