使用带有 Umbraco 控制器的简单注入器
Using Simple Injector with Umbraco Controller
我正在尝试将依赖项注入继承自 Umbraco 的 RenderMvcController 的控制器并收到错误
No registration for type RenderMvcController could be found and an implicit registration could not be made. For the container to be able to create RenderMvcController it should have only one public constructor: it has 3. See https://simpleinjector.org/one-constructor for more information.
下面是我连接 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);
}
这是一个 class 接收依赖的例子,它继承自 class 我写的
public class NewsroomController : BaseRenderMvcController
{
public NewsroomController(ICacheService cacheService) : base(cacheService) { }
基础 class 扩展了 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 继承的控制器很好地结合。
提前致谢!
异常消息"No registration for type RenderMvcController could be found and an implicit registration could not be made"意味着RenderMvcController
类型是直接从Simple Injector请求的,而它还没有被注册。控制器类型通常仅由 DefaultControllerFactory
请求,并且只有在收到在其 url 中包含控制器名称的请求时才会请求特定类型,如:http:\localhost\RenderMvc
.
由于您在评论中指出 RenderMvcController
仅用作基本控制器,因此我怀疑它实际上是由 MVC 请求的。我认为你应该调查一下。
但是如果确实需要使用这个控制器,你可以像这样简单地在 Simple Injector 中注册它:
container.Register<RenderMvcController>(() => new RenderMvcController());
有一些方法可以覆盖 Simple Injector 的 constructor resolution behavior, but I would advise against doing this, because it is an anti-pattern for components to have multiple constructors. It's wise to don't use a container's auto-wiring behavior on framework types (as explained here),因此建议使用 lambda 注册它们。
我正在尝试将依赖项注入继承自 Umbraco 的 RenderMvcController 的控制器并收到错误
No registration for type RenderMvcController could be found and an implicit registration could not be made. For the container to be able to create RenderMvcController it should have only one public constructor: it has 3. See https://simpleinjector.org/one-constructor for more information.
下面是我连接 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);
}
这是一个 class 接收依赖的例子,它继承自 class 我写的
public class NewsroomController : BaseRenderMvcController
{
public NewsroomController(ICacheService cacheService) : base(cacheService) { }
基础 class 扩展了 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 继承的控制器很好地结合。
提前致谢!
异常消息"No registration for type RenderMvcController could be found and an implicit registration could not be made"意味着RenderMvcController
类型是直接从Simple Injector请求的,而它还没有被注册。控制器类型通常仅由 DefaultControllerFactory
请求,并且只有在收到在其 url 中包含控制器名称的请求时才会请求特定类型,如:http:\localhost\RenderMvc
.
由于您在评论中指出 RenderMvcController
仅用作基本控制器,因此我怀疑它实际上是由 MVC 请求的。我认为你应该调查一下。
但是如果确实需要使用这个控制器,你可以像这样简单地在 Simple Injector 中注册它:
container.Register<RenderMvcController>(() => new RenderMvcController());
有一些方法可以覆盖 Simple Injector 的 constructor resolution behavior, but I would advise against doing this, because it is an anti-pattern for components to have multiple constructors. It's wise to don't use a container's auto-wiring behavior on framework types (as explained here),因此建议使用 lambda 注册它们。