Einfache Injektor Nicht in der Lage zu Injizieren von Abhängigkeiten in der Web-API-Controller
Ich bin versucht zu tun, einige grundlegende Konstruktor DI mit Einfach Injektor, und es scheint, dass es nicht beheben können die Abhängigkeiten für Web-API-Controller.
- Ich habe einen API-controller in einem "API" - Ordner, außerhalb der "Controller" - Ordner.
- Ich habe auch versucht, indem Sie es in die "Controller" - Ordner, aber
das schien nicht zu viel von einem Unterschied. Der stack-trace
Ich erhalte ist ähnlich wie die vorgestellten in diese Frage. - Ich verwende eine frische Installation der "Einfache Injektor-MVC-Integration-Quick Start" NuGet-Paket - (v. 2.1.0).
- Ich habe die base
SimpleInjectorWebApiDependencyResolver
aus der Dokumentation, die auch gleichzeitig als gefunden hier. - Ich bin mit Entity Framework, und habe mir die Diskussion
thread über die änderungen ordnungsgemäß geladen Rahmen.
Diese nicht
scheint ein problem zu sein, aber ich habe immer die folgende Fehlermeldung:
Typ " MyProject.API.ArticleController' hat keinen Standardwert
KonstruktorSystem.ArgumentException bei
System.Linq -.Ausdrücke.Ausdruck.Neue(Type Type) bei
System.Web.Http.Intern.TypeActivator.Erstellen[TBase](Typ
instanceType) bei
System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage
Anfrage, Type controllerType, Func`1& activator) an
System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Erstellen(HttpRequestMessage
Anfrage, HttpControllerDescriptor controllerDescriptor Geben
controllerType)
Es wäre schön, wenn jemand könnte mir einige Vorschläge, ob hier etwas geändert werden sollte, von seinem aktuellen Zustand/call um.
ArticleController (Grundstruktur):
public class ArticleController : ApiController
{
private readonly IArticleRepository articleRepository;
private readonly IUserRepository userRepository;
private readonly IReleaseRepository releaseRepository;
public ArticleController(IArticleRepository articleRepository, IUserRepository userRepository, IReleaseRepository releaseRepository)
{
this.articleRepository = articleRepository;
this.userRepository = userRepository;
this.releaseRepository = releaseRepository;
}
//GET api/Article
public IEnumerable<Article> GetArticles(){ //code }
//GET api/Article/5
public Article GetArticle(int id){ //code }
//PUT api/Article/5
public HttpResponseMessage PutArticle(int id, Article article){ //code }
//POST api/Article
public HttpResponseMessage PostArticle(ArticleModel article){ //code }
//DELETE api/Article/5
public HttpResponseMessage DeleteArticle(int id){ //code }
}
SimpleInjectorInitializer:
public static class SimpleInjectorInitializer
{
public static void Initialize()
{
var container = new Container();
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
private static void InitializeContainer(Container container)
{
container.Register<IArticleRepository, ArticleRepository>();
container.Register<IUserRepository, UserRepository>();
container.Register<IReleaseRepository, ReleaseRepository>();
}
}
Global.asax.cs:
public class WebApiApplication : System.Web.HttpApplication
{
private void ConfigureApi()
{
//Create the container as usual.
var container = new Container();
//Verify the container configuration
//container.Verify();
//Register the dependency resolver.
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
ConfigureApi();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
InformationsquelleAutor der Frage user1417835 | 2013-04-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
TLTR: das problem wird verursacht durch die implizite Art und Weise Web-API handles auflösen controller-Typen; registrieren Sie Ihre Web-API-Controller explizit und du wirst sehen, wo das problem ist.
Hier ist eine Schritt-für-Schritt, was geschieht, unter der Decke:
System.Web.Http.DefaultHttpControllerActivator
Anrufe in dieSimpleInjectorWebApiDependencyResolver
und fordert die Schaffung einer API-controller.SimpleInjectorWebApiDependencyResolver
nach vorne rufen, um dieSimpleInjector.Container
Instanz.Container
Instanz jedoch nicht über eine explizite Anmeldungen für die API-Controller (da Sie lieferte einen leeren Behälter auf die Auflösung).IServiceProvider.GetService
Methode und die Art nicht registriert war ausdrücklich vorgesehen.SimpleInjectorWebApiDependencyResolver
'sGetService
Methode zurücknull
als gut, da es per definition, dass es null zurückgeben sollte; Es sollte null zurückgeben, wenn keine Registrierung vorhanden ist (und das ist derzeit der Fall).DependencyResolver
null zurückgegeben,DefaultHttpControllerActivator
zurückgreifen, um seine Standard-Verhalten, was bedeutet erstellen, geben Sie sich selbst, aber dies erfordert, dass der controller einen Standard-Konstruktor.Lange Geschichte kurz, das problem wird verursacht durch die implizite Art und Weise Web-API-Griffe lösen-controller-Typen.
Also die Lösung ist:
Container
in Ihrer web-Anwendung. Dies verhindert, dass alle Arten von Schwierigkeiten und Komplikationen mit Ihrer Konfiguration.container.Verify()
welche die Anwendung fehl, während des Startvorgangs, wenn die Konfiguration ungültig ist (ein überprüf die Konfiguration ist wichtig). Und dies erlaubt Ihnen auch,diagnose die Konfigurationdie Ihnen noch mehr Vertrauen über die Richtigkeit Ihrer Konfiguration.Meine Beratung zu platzieren, MVC und Web API in eigene Projekte. Das wird die Dinge viel einfacher machen.
Registrieren alle Web-API-Controller kann man mit dem folgenden code:
UPDATE:
Weil dieser Fehler ist so weit verbreitet, neuere Versionen der
SimpleInjectorWebApiDependencyResolver
Klasse einfach nie zurücknull
wenn eine controller-Typ angefordert wird. Stattdessen wird es werfen eine beschreibende Fehlermeldung. Deshalb sollten Sie nie sehen, Fehler mehr, solange Sie die offizielleSimpleInjectorWebApiDependencyResolver
.InformationsquelleAutor der Antwort Steven