Search code examples
c#umbracosimple-injector

Preventing simple injector from conflicting with Umbraco controllers


Despite only regestering my own mvc controllers in my Umbraco solution, simple injector seems to affect Umbraco's backoffice controllers too. If I run the snippet below, the Umbraco backoffice controllers are getting exceptions, similar to the problems in this thread.

Do I need to add something like a custom controller activator too?

protected void Application_Start(object sender, EventArgs e) {

    var container = new Container();
    container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();

    var registeredControllerTypes = 
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly())
    .Where(type => type.IsSubClassOf(typeof(MyController)));

    foreach (var controllerType in registeredControllerTypes)
    {
        container.Register(controllerType, controllerType, Lifestyle.Transient);
    }

    container.Verify();

    DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}

Solution

  • Solved with an updated version of @Steven's comment:

    public class UmbracoConstructorBehavior : IConstructorResolutionBehavior
    {
        public IConstructorResolutionBehavior DefaultBehavior { get; set; }
        public ConstructorInfo GetConstructor(Type implementationType)
        {
            return implementationType.Namespace != null 
              && implementationType.Namespace.Contains("Umbraco")
                ? GetUmbracoConstructor(implementationType)
                : DefaultBehavior.GetConstructor(implementationType);
        }
    
        private ConstructorInfo GetUmbracoConstructor(Type i) => 
           i.GetConstructors().OrderBy(c => c.GetParameters().Length).FirstOrDefault() 
           ?? DefaultBehavior.GetConstructor(i);
    }