【发布时间】:2016-04-16 14:40:35
【问题描述】:
我正在尝试将依赖项注入到从 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) { }
基类扩展了作为 Umbraco 控制器的 RenderMvcController
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是一个基类,不打算由用户直接调用,如http://mysite/rendermvc?谁定义了这个RenderMvcController?你或者它是另一个图书馆的一部分(比如 Umbraco 本身)? -
是的,RenderMvcController 是 Umbraco 自己提供的控制器,它可以从那里继承。
-
这就是我制作 BaseRenderMvcController 的原因,只是为了有一个我可以控制的基础,但我的基础仍然必须从 RenderMvcController 继承才能让 Umbraco 满意。
-
我无法想象这个
RenderMvcController是在 Umbraco 程序集中定义的,因为在这种情况下,控制器不会在容器中注册,因为您只是调用RegisterMvcControllers(Assembly.GetExecutingAssembly()),这仅仅意味着只有在你的 MVC 项目中定义的控制器才会被注册。你能找出RenderMvcController存在于哪个程序集中以及是什么原因导致它被注册? -
嗯,是的,它在
packages\UmbracoCms.Core.7.4.1\lib\umbraco.dll中,这就是我尝试检查 RenderMvcController 时得到的结果。不过,整个 CMS 都安装在我的主 MVC 项目中。
标签: c# dependency-injection umbraco simple-injector