Die Ninject-Bindung mit generischem MVC-Repository gibt einen Fehler im parameterlosen Konstruktor zurück
Ich versuche, ein relativ einfaches generisches Repository für eine Reihe von Verwaltungslisten in einer Anwendung zu verwenden. Die Funktionalität für die Benutzer mit Administratorrechten ist nur CRUD, um die Listen auf dem neuesten Stand zu halten und an anderer Stelle als Nachschlagewerk zu verwenden.
Ich erhalte immer wieder einen Fehler in der Form:
Beim Erstellen eines Controllers vom Typ "WhatWorks.Controllers.AchievementController" ist ein Fehler aufgetreten. Stellen Sie sicher, dass die Steuerung über einen parameterlosen öffentlichen Konstruktor verfügt.
Ich habe sehr viele Posts auf SO und Blogs gelesen, die über Google gefunden wurden, aber ich kann keine Antwort finden (zumindest nichts, was für mich als Antwort sinnvoll ist, was ein weiteres Problem sein könnte ...)
Mein Code lautet wie folgt:
Regler
public class AchievementController : BootstrapBaseController
{
private readonly IAdminRepository<tAchievement> _repo;
public AchievementController(IAdminRepository<tAchievement> _repo)
{
this._repo = _repo;
}
ViewModel
public partial class AchievementListViewModel
{
public int Id { get; set; }
public string achievement { get; set; }
}
Schnittstelle
public interface IAdminRepository<TEntity> : IDisposable
where TEntity : class
{
IEnumerable<TEntity> Get();
TEntity GetByID(int id);
void Insert(TEntity entity);
void Delete(TEntity entity);
void Update(TEntity entity);
void Save();
}
Repository
public class AdminRepository<T> : IAdminRepository<T>
where T : class
{
private WhatWorksEntities objContext;
public AdminRepository()
{
objContext = new WhatWorksEntities();
}
public IEnumerable<T> Get()
{
return objContext.Set<T>().ToList();
}
etc.
Bindung
kernel.Bind(typeof(IAdminRepository<>)).To(typeof(AdminRepository<>));
Ich habe auch versucht, mit einer zusätzlichen Zeile ohne Wirkung zu binden:
kernel.Bind<IAdminRepository<tAchievement>>().To<AdminRepository<tAchievement>>();
Ich gehe davon aus, dass mir etwas Einfaches fehlt.
Ich habe Ninject, Ninject.Web.MVC und Ninject.Web.Common in meinen Referenzen - alle von NuGet übernommen.
Stack-Trace lautet wie folgt:
[MissingMethodException: No parameterless constructor defined for this object.]
System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +113
System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232
System.Activator.CreateInstance(Type type, Boolean nonPublic) +83
System.Activator.CreateInstance(Type type) +6
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +55
[InvalidOperationException: An error occurred when trying to create a controller of type 'WhatWorks.Controllers.AchievementController'. Make sure that the controller has a parameterless public constructor.]
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +179
System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80
System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74
System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +197
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +49
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
_____________EDIT mit teilweiser Antwort_____________
Nachdem ich ein Projekt von Grund auf neu erstellt und denselben Fehler festgestellt hatte, stellte ich fest, dass sich die Versionen einiger der von mir verwendeten zusätzlichen Pakete geändert hatten. Ich verwende "Twitter Bootstrap for MVC" von Eric Hexter als mein Hauptdisplay. Dabei wird eine neuere Version von Twitter Bootstrap verwendet als zuvor. Ich bin nicht sicher, ob dies das Problem verursacht, aber das Layout der Ordner in einem älteren Arbeitsprojekt unterscheidet sich vom neuen.
Diese Antwort hat mir nach den Kommentaren von Trevor Pilley einen anständigen Hinweis gegeben:Ninject + MVC3 injiziert nicht in den Controller
In meinem älteren Arbeitsprojekt befand sich Folgendes in der Datei Web.config, befindet sich jedoch nicht im neuen Projekt. Wenn ich es hinzufüge, funktioniert der Code, aber es gibt immer noch ein Problem mit dem Twitter Bootstrap-Layout - wahrscheinlich aufgrund der neuen .css-Dateien. Ich lasse die Frage offen, falls jemand dies als Antwort verbessern kann.
(Das schließende Tag von Entity Framework verbleibt, um den Speicherort in der Datei "Web.config" anzuzeigen.)
</entityFramework>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
_________EDIT global.asax ______________________
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BootstrapSupport.BootstrapBundleConfig.RegisterBundles(System.Web.Optimization.BundleTable.Bundles);
WhatWorksRouteConfig.RegisterRoutes(RouteTable.Routes);
AutoMapperConfiguration.Configure();
}
}