2

Ich möchte Dependency Injection in einer Medium Trust-Umgebung verwenden. Zu diesem Zweck wählte ich Ninject, als ich sein geringes Gewicht gesagt wurde. Wie richte ich die Injektion in die Controller ein?Probleme mit MVC-Controllern + Dependency Injection (Ninject) in Medium Trust

Wenn ich eine benutzerdefinierte Controller Factory zu erstellen versucht:

public class NinjectControllerFactory : DefaultControllerFactory 
    { 
     private readonly IKernel _kernel; 
     public NinjectControllerFactory(params IModule[] modules) 
     { 
      _kernel = new StandardKernel(modules); 
     } 

     public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) 
     { 
      IController controller = base.CreateController(requestContext, controllerName); 
      _kernel.Inject(controller); 
      return controller; 
     } 
    } 

Aber ich begegnet diesen Fehler:

System.InvalidOperationException was unhandled by user code 
    Message="An error occurred while creating a controller of type 'xxx'. 

If the controller doesn't have a controller factory, ensure that it has a parameterless public constructor."

Jede Idee, wie Ninject oder andere IoC-Framework unter Arbeitsmedium erhalten Vertrauen (dh keine Verwendung von Reflektion)

Antwort

1

Versuchen Sie, diese Option beim Erstellen Ihres Containers festzulegen:

UseReflectionBasedInjection = true; 
0

Guter Tipp (? Aber wollte man es auf false gesetzt), änderte ich meine Konstruktor, so dass sein wie folgt aus:

public NinjectControllerFactory(params IModule[] modules) 
     { 
      _kernel = new StandardKernel(modules); 
      _kernel.Options.UseReflectionBasedInjection = false; 
     } 

Dieser bekommt die gleiche Ausnahme though.

Ich habe auch versucht GetControllerInstance wie diese zu

protected override IController GetControllerInstance(Type controllerType) 
    { 
     return _kernel.Get(controllerType) as IController; 
    } 

Aber das löst eine Sicherheitsausnahme überschrieben, weil es Reflexion verwendet.

2

Um Ninject 1.x in mittlerer Vertrauenswürdigkeit auszuführen, müssen Sie die Option UseReflectionBasedInjection auf true setzen. Ninject 2.0 leidet nicht unter dieser Einschränkung.

Reflection ist eigentlich keine geschützte Operation in Medium Trust, aber leichte Code-Generierung (die Ninject standardmäßig für die Injektion verwendet) ist - zumindest vor .NET 3.5 SP1.

Sobald Sie zur reflexionsbasierten Injektion wechseln, sollte Ihr Code wie vorgesehen funktionieren. Ich würde Sie auch ermutigen, sich Ninject.Framework.Mvc (für Ninject 1.x) oder Ninject.Web.Mvc (für Ninject 2.0) anzuschauen. Diese Erweiterungen übernehmen die Schwerarbeit für Sie.

+0

Ich war Ninject 2. Ninject.Web.Mvc ist nicht vertrauenswürdig medium – Dan

2

Ich schaffte es nie, dieses Problem am Ende zu lösen, ich wechselte zu Unity - arbeitet in mittlerer Vertrauen ohne Ärger.

Verwandte Themen