Einfache Injektor - Stellen Sie sicher, dass der controller hat einen parameterlosen public-Konstruktor auf die Produktion
Ich bin stecken mit einem komischen situation. Ich bin nach Onion Architecture
und meine Architektur ist so etwas wie dieses:
1-Core
- Domain Classes
- Repository Interfaces
- Service Interfaces
2-Infrastructure
- Data
- Dependency Injection //Here I am using Simple Injector as dependency injection
- Repository Interfaces Implementation
- Service Interfaces Implementation
3-WebApi
- Web Api Project
4-WebClient
- My AngularJs App
5-Test
- Test Project
Dependency Injection:
[assembly: PreApplicationStartMethod(typeof(IocConfig), "RegisterDependencies")]
namespace Infrastructure.DependencyResolution
{
public class IocConfig
{
public static void RegisterDependencies()
{
var container = new Container();
container.RegisterWebApiRequest<IRepositoryAsync<Category>, Repository<Category>>();
container.RegisterWebApiRequest<ICategoryService, CategoryService>();
container.RegisterWebApiRequest<IDataContextAsync>(() => new MyContext());
container.Verify();
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
}
}
}
Web-Api-Projekt:
public class HomeController : ApiController
{
private readonly ICategoryService _categoryService;
public HomeController(ICategoryService categoryService)
{
_categoryService = categoryService;
}
}
Alles funktioniert sehr gut auf meinem local IIS
. Aber jetzt habe ich veröffentlicht, diese Anwendung auf dem Produktionsserver und jetzt ist er mir folgende Fehlermeldung:
{"message":"Ein Fehler ist aufgetreten.","exceptionMessage":"Ein Fehler
aufgetreten beim Versuch, einen Domänencontroller zu erstellen vom Typ 'HomeController'.
Stellen Sie sicher, dass der controller hat einen parameterlosen public
Konstruktor.","exceptionType":" - System.InvalidOperationException","stackTrace":"
bei
System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Erstellen(HttpRequestMessage
Anfrage, HttpControllerDescriptor controllerDescriptor Geben
controllerType)\\r \ \ n bei
System.Web.Http.Controller.HttpControllerDescriptor.CreateController(HttpRequestMessage
Anfrage)\\r \ \ n bei
System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()","innerException":{"message":"Ein
Fehler ist aufgetreten.","exceptionMessage":"Typ
'JetAdz.WebApi.Controller.HomeController " verfügt nicht über eine Standard
constructor","exceptionType":" - System.ArgumentException","stackTrace":"
System.Linq -.Ausdrücke.Ausdruck.Neue(Typ)\\r \ \ n bei
System.Web.Http.Intern.TypeActivator.Erstellen[TBase](Typ
instanceType)\\r \ \ n bei
System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage
Anfrage, Type controllerType, Func`1& activator)\\r \ \ n bei
System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Erstellen(HttpRequestMessage
Anfrage, HttpControllerDescriptor controllerDescriptor Geben
controllerType)"}}
InformationsquelleAutor Usman Khalid | 2015-08-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bitte werfen Sie einen Blick auf die innere Ausnahme von der Ausnahme geworfen. Es enthält die Angaben, die beschreibt, warum dies geschieht.
Gibt es mehrere Probleme hier. Sie sollten sicherstellen, dass Sie registrieren Sie alle Ihre Stamm-Typen explizit in den container. Controller sind root-Arten, denn Sie sind direkt geklärt (nichts hängt von Ihnen ab, aber Sie haben Abhängigkeiten). Wenn Sie nicht, registrieren Sie ausdrücklich, der container ist nicht in der Lage zu überprüfen, ob Sie geschaffen werden können, wenn Sie anrufen
Verify()
. Sie können sich registrieren, Ihre Controller durch den Aufruf der folgenden:Dies ist beschrieben in die Dokumentation.
Nachdem Sie dies getan haben, werden Sie wahrscheinlich direkt in die
Verify()
- Methode fehl, wenn Sie die Anwendung starten, und in diesem Fall, erhalten Sie eine sehr ausführliche Nachricht, in der erklärt, was schief läuft.Aus der die innere Ausnahme, die Sie sehen können, die Web-API ist
DefaultHttpControllerActivator.GetInstanceOrActivator
Methode ruftTypeActivator.Create<T>(Type)
. Dies geschieht nur, wenn der Anruf zurequest.GetDependencyScope().GetService(controllerType)
zurücknull
. Aber dies ist normalerweise etwas, das kann nicht passieren, wenn Sie süchtig in derSimpleInjectorWebApiDependencyResolver
in der Web API pipeline. Dies ist, weil dieSimpleInjectorWebApiDependencyResolver
nie zurücknull
wenn es angefordert wird, um zu beheben eineIHttpController
Umsetzung. Stattdessen wird eine exception werfen, wenn ein Domänencontroller nicht aufgelöst werden können.Also dies ist für mich ein Indiz für eine Bindung redirect problem in Ihrer Anwendung. Dies bedeutet, dass die SimpleInjector.Integration.WebApi.dll bezieht sich auf eine andere
IHttpController
version als das, was Ihre Anwendung. Bindung Umleitungen sind gedacht, um dieses Problem zu lösen, so stellen Sie sicher, dass Ihre Anwendung die richtige Bindung. Für die System.Web.Http.dll es sieht so aus (aber beachten Sie, dass müssen Sie möglicherweise andere Bindungen):In der Regel sind die Bindungen verwaltet von NuGet-Paket-manager, aber es scheitert, dies zu tun auf einer regelmäßigen basis.
Wenn die Bindung redirect Problem behoben ist, wirst du sehen, dass die innere Ausnahme enthält Informationen, die von Einfachen Injektor mit den gleichen Informationen sehen Sie beim Aufruf
Verify()
.In der log-Datei.
Ich habe diesen Fehler aus der log-Datei.
Kontaktieren Sie system-administrator. Er wusste, wie er an diese information zu gelangen.
Ok, ich habe die innere Ausnahme, und es ist auch so: "innerException":{"message":"Ein Fehler ist aufgetreten.","exceptionMessage":"Typ" JetAdz.WebApi.Controller.HomeController "verfügt nicht über eine Standard-Konstruktor","exceptionType":" - System.ArgumentException","stackTrace":" bei System.Linq -.Ausdrücke.Ausdruck.Neue(Typ)\\r \ \ n bei System.Web.Http.Intern.TypeActivator.Erstellen[TBase](Typ instanceType)
InformationsquelleAutor Steven
Sind Sie nicht die Registrierung der richtigen DependencyResolver für WebApi. Nach der WebApi Dependency Injection Seite und die Einfache Injektor-WebApi-Seite, es soll so geschehen.
Die Konfiguration, die Sie gezeigt haben, ist für MVC, dependency injection (die Sie möglicherweise auch brauchen).
Wahrscheinlich, weil Sie im klassischen Modus ausgeführt wird.
Es hat nicht das Problem zu lösen.
Ich entdeckte ein weiteres Problem, veränderte sich meine Antwort.
Vielen Dank. Es funktionierte für mich. 🙂 Cheers
InformationsquelleAutor NightOwl888
Ich nutzen spring, XML-Dateien zu injizieren Variablen in meinen Klassen. In meinem Fall war es ein copy/paste Fehler, wenn ich das erstellt einen neuen controller.
Also, während dies nicht gerade im Zusammenhang mit der OP problem ist es kommt die gleiche Fehlermeldung und meine jemand anderes helfen.
Ich kopiert hatte (die Spitzen Klammern geändert eckigen Klammern):
wenn das, was ich brauchte, war:
Hinweis: die Immobilien anstelle von constructor-arg.
Weil meine Klasse hat keinen Konstruktor der Suche nach einem parameter.
InformationsquelleAutor isopropanol