2016-07-13 30 views
1

Ich erhalte diese Fehlermeldung:MVC-Controller will leer contructor aber dann Schnittstelle nicht verwendet und wirft Fehler

An exception of type 'System.NullReferenceException' occurred in PubStuff.Intern.Web.Internal.dll but was not handled in user code Additional information: Object reference not set to an instance of an object

public class InternController : BaseController 
{ 
    IInternService _internService; 


    public InternController() { } 

    public InternController(IInternService internService) 
    { 
     _internService = internService; 
    } 


    // GET: Intern 
    public ActionResult Index() 
    { 
     object responseObject = null; 


     responseObject = _internService.GetAllSkills(); 

     return View(); 
    } 
} 
  1. Es klagt Wenn ich leer Konstruktor nicht
  2. Einmal haben Es gibt einen leeren Konstruktor, dann wirft diese Zeile responseObject = _internService.GetAllSkills(); den Fehler.

_internService ist null

Wie kann ich dieses Problem beheben?Was sind die Probleme?

Updates ich ein Problem mit am Ende mit StructureMap ob ich hinzufügen IInternUnitOfWork oder nicht.

ich hinzugefügt, um die IInternService zu StructureMap und dann nicht

Fehler geworfen

protected override object DoGetInstance(Type serviceType, string key) 
    { 
     if (string.IsNullOrEmpty(key)) 
     { 
      return serviceType.IsAbstract || serviceType.IsInterface 
         ? this.Container.TryGetInstance(serviceType) 
         : this.Container.GetInstance(serviceType); 
     } 

     return this.Container.GetInstance(serviceType, key); 
    } 

"StructureMap Exception Code: 202\nNo Default Instance defined for PluginFamily PublicHealth.Intern.DataAccess.Contracts.IInternUnitOfWork, PublicHealth.Intern.DataAccess.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"}

+1

Welches DI-Framework verwenden Sie, um den Dienst zu injizieren? –

+0

Ich nehme an, die Tatsache, dass ein Standardkonstruktor gewünscht wird, bedeutet, dass irgendwo Ihr Code (oder automatisch generierter/Bibliothekscode) auf einen Standardkonstruktor verweist. Da dieser Konstruktor _internService nicht initialisiert, macht es Sinn, dass Sie eine Nullreferenz erhalten, wenn Sie versuchen, sie aufzurufen. – nhouser9

+0

@StephenMuecke - StructureMap - alte Version (2.6.1) Ich hasse es –

Antwort

5

Sieht so aus, als ob Sie von der Fehlermeldung "Kein Standardkonstruktor" gebrannt wurden. Bei Verwendung von DI bedeutet dies NICHT, dass Sie einen leeren Konstruktor hinzufügen sollten.

public InternController() { } 

Tatsächlich ist using multiple constructors with DI is anti-pattern.

Diese Fehlermeldung bedeutet, dass Ihr DI-Container nicht in MVC eingesteckt ist und daher MVC Ihre Konstruktorparameter nicht über den DI-Container auflösen kann. Sie müssen die Zeile hinzufügen, um es zu stopfen, dass wie folgt aussieht:

ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory(container)); 

ODER

DependencyResolver.SetResolver(new StructureMapDependencyResolver(container)); 

Eine dieser Zeilen muss innerhalb Ihres composition root in Ihrer Anwendung Startcode sein, nachdem Sie nur Registrieren Sie die Typen mit StructureMap.

+0

Ich weiß, dass StructureMap sicher aufgerufen wird, aber irgendwie th Die Mappings müssen nicht korrekt sein. Ich ordne nicht im IInternService ab, aber ich habe IPubDbContext .. und IInernUnitofWork etc ... –

+0

OIC. Einige Leute haben berichtet, dass einige DI-Container, die nicht korrekt konfiguriert sind, * auch * diese Ausnahme auslösen können. Eine Sache, die Sie tun können, um "zu teilen und zu erobern", ist zu versuchen, den Controller direkt durch StructureMap * direkt nach Ihrem Anwendungsstartcode * aufzulösen (als temporärer Test). 'var x = container.Resolve ();'. – NightOwl888

-1

Sie benötigen einen leeren Konstruktor, so versuchen, dies hilft:

public InternController():this(new MyInternService()) 
{ 
} 

Wo MyInternService ist Ihre Standard IInternService Implementierung (dh die IInternService Sie in der Produktion verwenden werden).

Dieses Muster wird am häufigsten verwendet, um einen Controller mit "Test" -Daten zu versorgen und einige Definitionen beim Aufruf ändern zu können, z. B. mithilfe von Test-Frameworks.

+0

Nur vergessen: Dies ruft Ihren zweiten Konstruktor mit einer Implementierung von IInternService (MyInternService) –

+0

Nicht sicher, dass ich folge. InternService tut IInterService-Schnittstelle implementieren, aber wenn ich diese 'öffentlichen InternController tun(): diese (neue InternService()) {}' Das funktioniert nicht –

+0

Severity \t-Code \t Beschreibung \t Projekt \t Datei \t Linie \t Unterdrückungszustand Fehler \t CS7036 \t Es gibt kein angegebenes Argument, das dem erforderlichen formalen Parameter 'internUnitOfWork' von 'InternService.InternService (IInternUnitOfWork)' \t PubStuff.Intern.Web.Internal \t C: \ IPAA \ Main \ Src \ PubStuffIntern \ PubStuff.Intern.Web entspricht .Internal \ Controllers \ InternController.cs Active –