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

时间:2016-04-16 14:40:36

标签: c# dependency-injection umbraco simple-injector

我正在尝试将依赖项注入到从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继承的这个控制器。

提前致谢!

1 个答案:

答案 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注册它们。