Umbraco ApplicationEventHandler中的依赖项注入。缺陷

Umbraco ApplicationEventHandler中的依赖项注入。缺陷,umbraco,Umbraco,翁布拉科v7.5.8 我在DI设置方面有很多问题(如下所示) 1) 如果构造函数采用参数,则不会触发OnApplicationInitialized或OnApplicationStarted(和其他)事件 2) 后台坏了。无法访问内容节点。例外消息是: 尝试创建“ContentController”类型的控制器时出错。确保控制器具有无参数公共构造函数 // Application handlers public class UmbracoApplicationEventHandl

翁布拉科v7.5.8

我在DI设置方面有很多问题(如下所示)

1) 如果构造函数采用参数,则不会触发OnApplicationInitialized或OnApplicationStarted(和其他)事件

2) 后台坏了。无法访问内容节点。例外消息是: 尝试创建“ContentController”类型的控制器时出错。确保控制器具有无参数公共构造函数

    // Application handlers
    public class UmbracoApplicationEventHandler : IApplicationEventHandler
    {   
        private IMenuManager _menuManager;

        public UmbracoApplicationEventHandler(IMenuManager menuManager)
        {
            _menuManager = menuManager;
        }

        public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
        {
            ContentService.Saving += UpdateMenu;
        }

        private void UpdateMenu(IContentService sender, SaveEventArgs<IContent> saveEventArgs)
        {
            _menuManager.UpdateMenu();
        }
    }

// Unity config:
public static class UnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();

        container.RegisterType<IMenuManager, MenuManager>();

        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    }

}

// Owin Startup:
public class UmbracoStandardOwinStartup : UmbracoDefaultOwinStartup
{
    public override void Configuration(IAppBuilder app)
    {
        //ensure the default options are configured
        base.Configuration(app);

        UnityConfig.RegisterComponents();
    }
}
//应用程序处理程序
公共类UmbracoApplicationEventHandler:IAApplicationEventHandler
{   
私人IMenuManager_menuManager;
公共umbraco应用程序venthandler(IMenuManager菜单管理器)
{
_菜单管理器=菜单管理器;
}
应用程序启动时公共无效(umbraco应用程序基础umbraco应用程序,应用程序上下文应用程序上下文)
{
ContentService.Saving+=UpdateMenu;
}
私有无效更新单元(IContentService发送方,SaveEventArgs SaveEventArgs)
{
_menuManager.UpdateMenu();
}
}
//统一配置:
公共静态类UnityConfig
{
公共静态无效注册表组件()
{
var container=new UnityContainer();
container.RegisterType();
GlobalConfiguration.Configuration.DependencyResolver=新的UnityDependencyResolver(容器);
}
}
//Owin启动:
公共类UmbracoStandardOwinStartup:UmbracoDefaultOwinStartup
{
公共覆盖无效配置(IAppBuilder应用程序)
{
//确保配置了默认选项
基本配置(app);
UnityConfig.RegisterComponents();
}
}
请阅读:


您需要在ApplicationStarted事件上注册并构建容器,如果您想让它与Umbraco一起工作,就不要提前注册和构建容器。

谢谢,Marcin。本文中的方法适用于常规控制器。但它不能与ApplicationEventHandler一起工作,因为缺少支持的参数化构造函数(如我在主题描述中所述)。有什么想法吗?为什么要将菜单管理器直接注入ApplicationStartup类?我会创建一个服务来处理这个方法,这个方法会被注入到它自己的构造函数中。例如,每次在CMS中发布文档时,我都想触发MenuManager.UpdateMenu()。@MarcinZajkowski您是否能够使它与带参数的
ApplicationEventHandler
构造函数一起工作?还是说翁布拉科在国际奥委会的问题上只是狗屎?似乎是后者,因为自2017年3月以来一直没有解决方案…@Ash在Umbraco中使用IoC/DI没有问题,但它需要遵循上面发布的说明-这两个类在应用程序启动时启动,所有注册都应该在启动后进行-不直接向这些类注入。除此之外,一切都很好:)