使用带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继承的控制器。

提前感谢!

使用带Umbraco控制器的简单注射器

异常消息"找不到类型RenderMvcController的注册,无法进行隐式注册"意味着RenderMvcController类型是直接从Simple Injector请求的,但尚未注册。控制器类型通常只由DefaultControllerFactory请求,并且只有当它收到url中包含控制器名称的请求时,它才会请求特定类型,如:http:''localhost'RenderMvc'3

由于您在评论中指出RenderMvcController仅用于基本控制器,因此我怀疑它实际上是MVC请求的。我认为你应该调查一下。

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

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

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