我正在尝试将依赖项注入到从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<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控制器确实有3个不同的构造函数
public class RenderMvcController : UmbracoController, IRenderMvcController, IRenderController, IController
{
public RenderMvcController();
public RenderMvcController(UmbracoContext umbracoContext);
public RenderMvcController(UmbracoContext umbracoContext, UmbracoHelper umbracoHelper);
我不知道如何让SimpleInjector很好地放置从Umbraco继承的这个控制器。
提前致谢!
答案 0 :(得分:5)
异常消息“无法注册RenderMvcController类型并且无法进行隐式注册”意味着直接从Simple Injector请求RenderMvcController
类型,但尚未注册。控制器类型通常仅由DefaultControllerFactory
请求,并且只有在获取其URL中具有控制器名称的请求时才会请求特定类型,如:http:\\localhost\RenderMvc\3
。
由于您在评论中声明RenderMvcController
仅用作基本控制器,因此我发现它确实是MVC实际请求的。我想你应该研究一下。
但是真的需要使用这个控制器,你可以简单地在Simple Injector中注册它:
container.Register<RenderMvcController>(() => new RenderMvcController());
有一些方法可以覆盖Simple Injector的constructor resolution behavior,但我建议不要这样做,因为它是anti-pattern for components to have multiple constructors。明智的做法是不要在框架类型上使用容器的自动布线行为(如here所述),因此建议使用lambda注册它们。