2017-02-27 1 views
0

Umbraco v7.5.8Dependency-Injektion in ApplicationEventHandler. Fehler?

Ich habe eine Reihe von Problemen mit DI-Setup (siehe unten).

1) Weder OnApplicationInitialized noch OnApplicationStarted (und andere) Ereignisse ausgelöst, wenn Konstruktor Parameter (n) übernimmt.

2) Backoffice ist defekt. Es ist nicht möglich, auf einen Inhaltsknoten zuzugreifen. Die Ausnahmebedingungsnachricht lautet: Beim Versuch, einen Controller vom Typ 'ContentController' zu erstellen, ist ein Fehler aufgetreten. Stellen Sie sicher, dass der Controller über einen parameterlosen öffentlichen Konstruktor verfügt.

// 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(); 
    } 
} 

Antwort

2

Bitte lesen: https://our.umbraco.org/documentation/reference/using-ioc.

Sie müssen registrieren und bauen Sie Ihren Container auf OnApplicationStarted Ereignis, nicht früher, wenn Sie es mit Umbraco arbeiten möchten.

+0

Danke, Marcin. Der Ansatz in dem Artikel funktioniert mit regulären Controllern. Aber es funktioniert nicht mit ApplicationEvenHandler, weil es keine unterstützenden parametrisierten Konstruktoren gibt (wie ich in der Themenbeschreibung angegeben habe). Irgendwelche Ideen? –

+0

Warum möchten Sie Ihren MenuManager direkt in die ApplicationStartup-Klasse injizieren? Ich würde einen Dienst erstellen, um diese Methode (n) zu behandeln, die es in seinem eigenen Konstruktor injiziert bekommen würde. –

+0

Da ApplicationStartup von MenuManager abhängig ist. Zum Beispiel möchte ich MenuManager.UpdateMenu() jedes Mal auslösen, wenn das Dokument in CMS veröffentlicht wird. –

Verwandte Themen