使用带Umbraco控制器的简单注射器
本文关键字:简单 注射器 控制器 Umbraco | 更新日期: 2024-09-22 17:51:51
我正试图将一个依赖项注入一个继承自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继承的控制器。
提前感谢!
异常消息"找不到类型RenderMvcController的注册,无法进行隐式注册"意味着RenderMvcController
类型是直接从Simple Injector请求的,但尚未注册。控制器类型通常只由DefaultControllerFactory
请求,并且只有当它收到url中包含控制器名称的请求时,它才会请求特定类型,如:http:''localhost'RenderMvc'3
。
由于您在评论中指出RenderMvcController
仅用于基本控制器,因此我怀疑它实际上是MVC请求的。我认为你应该调查一下。
但如果真的需要使用这个控制器,你可以简单地在Simple Injector中注册它,如下所示:
container.Register<RenderMvcController>(() => new RenderMvcController());
有一些方法可以覆盖SimpleInjector的构造函数解析行为,但我建议不要这样做,因为组件具有多个构造函数是一种反模式。明智的做法是不要在框架类型上使用容器的自动连接行为(如本文所述),因此建议使用lambda注册它们。