0

Ich bin ein ASP.net WebApi erstellen und versuchen, Entity neben verwenden. Ich folge diesem Leitfaden.Interner Server Fehler 500 Asp.net WebApi versucht, DI mit Entität

Getting Started with ASP.NET Web API 2 (C#)

Ich erhalte einen 500 Internal Server Error Fiddler verwenden. Die JSON Ausnahmemeldung besagt ExceptionMessage=An error occurred when trying to create a controller of type 'LocationsController'. Make sure that the controller has a parameterless public constructor.

Hier ist die Controller.cs

[RoutePrefix("api/Locations")] 
public class LocationsController : ApiController 
{ 
    // GET api/<controller> 
    private IlocationsRepository LocationsRepo; 

    public LocationsController(IlocationsRepository _repo) 
    { 
     if (_repo == null) { throw new ArgumentNullException("_repo"); } 
     LocationsRepo = _repo; 
    } 

    [HttpGet] 
    [Route("")] 
    public IEnumerable<Location> GetAll() 
    { 
     return LocationsRepo.GetAll(); 
    } 
} 

Ich kann nicht einen parameter öffentlichen Konstruktor verwenden, weil ich das Datenbank-Repository verwenden müssen, die für Locations erstellt wurde. Ich verifizierte das Problem mit der IlocationsRepository, indem Sie Folgendes tun.

Wenn ich den LocationsController Konstruktor mit keinen Parametern ersetzen und eine List<Location> innerhalb der Steuerung deklarieren, und Dummy-Daten verwenden. Ich erhalte eine 200 mit allen JSON Daten korrekt. Hier

ist der Start der Datei Global.asax.cs

public class Global : System.Web.HttpApplication 
{ 
    protected void Application_Start(object sender, EventArgs e) 
    { 
     GlobalConfiguration.Configure(WebApiConfig.Register); 
    } 

    protected void Session_Start(object sender, EventArgs e) 
    { 

    } 
} 

Es scheint, als ob ich brauche die Dependency Injection im Global zu tun, aber keiner der Führer hatte keine Informationen in Bezug auf diesen Teil.

Denn hier Nachwelt die ContextDB cs, hier

public class WebServerContext : DbContext 
{ 
    public WebServerContext() : base("WebServerContext") {} 
    public DbSet<Order> dOrders { get; set; } 
    public DbSet<Location> dLocations { get; set; } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    } 
} 

Weitere Nachwelt ist die Standorte Repository.

public class LocationsRepository : IlocationsRepository 
{ 
    private z_Data.WebServerContext db = new z_Data.WebServerContext(); 

    public void Add(Location item) 
    { 
     db.dLocations.Add(item); 
    } 
    public IEnumerable<Location> GetAll() 
    { 
     return db.dLocations; 
    } 
} 
+0

Wo ist Ihr DI-Code? – Legends

+0

Dies scheint zu sein, was mir fehlt, und ich verwende nicht Unity. –

+0

Sofern Sie keinen ASP.NET vNext-Alias ​​Core verwenden, benötigen Sie einen DI-Provider wie Unity oder etwas anderes ... – Legends

Antwort

3

Per Dependency Injection for Web Api tutorial on MSDN, Sie vermissen die Linie, die die Abhängigkeit Resolver (eine konkrete Klasse, die System.Web.Http.IDependencyResolver implementiert) registrieren Web Api. Es fungiert als Brücke zwischen Ihrem DI-Container und der Web-API, sodass es Ihre Konstruktorabhängigkeiten auflösen kann.

public static void Register(HttpConfiguration config) 
{ 
    var container = new UnityContainer(); 
    container.RegisterType<IProductRepository, ProductRepository>(new HierarchicalLifetimeManager()); 
    config.DependencyResolver = new UnityResolver(container); // <- You need this 

    // Other Web API configuration not shown. 
} 

Das setzt natürlich voraus, dass Sie Unity verwenden. Wenn nicht, sollten Sie entweder den DependencyResolver verwenden, der mit Ihrem DI-Container geliefert wurde, oder Ihren eigenen implementieren.

HINWEIS: Bei einigen DI Container, müssen Sie auch ausdrücklich alle Ihre Controller registrieren.

+0

Hat die Entity dann einen Resolver? Ich denke, das ist was ich vermisse, ich habe das für das Mapping von Attributen getan. Irgendwelche Hinweise? –

+2

Nein, Entity Framework ist ein Objekt für Relational Mapper (für Datenbanken). Es hat überhaupt nichts mit DI zu tun.Sie müssen einen der vielen zu verwendenden DI-Container auswählen (obwohl ich Unity oder Ninject nicht empfehlen würde, da beide schwer zu konfigurieren sind, aber Autofac, SimpleInjector und StructureMap gute Optionen sind). – NightOwl888

+0

Ich habe den SimpleInjector verwendet, da Unity zu viel Overhead zu haben schien. Vielen Dank. –

Verwandte Themen