与通用存储库MVC的Ninject绑定在Parameterless Constructor上返回错误

时间:2013-09-10 16:09:14

标签: asp.net-mvc ninject

我试图在应用程序中为一些管理列表使用一个相当简单的通用存储库。管理员用户的功能只是CRUD,以使列表保持最新,以便在其他地方用作查找。

我一直收到错误的表单:

  

尝试创建类型的控制器时发生错误   ' WhatWorks.Controllers.AchievementController&#39 ;.确保   controller有一个无参数的公共构造函数。

我已经阅读了很多关于通过Google发现的SO和博客的帖子,但我无法找到答案(至少没有任何对我有意义的答案可能是另一个问题.. 。)

我的代码如下:

控制器

public class AchievementController : BootstrapBaseController
{
    private readonly IAdminRepository<tAchievement> _repo;

    public AchievementController(IAdminRepository<tAchievement> _repo)
    {
        this._repo = _repo;
    }

视图模型

public partial class AchievementListViewModel
{
    public int Id { get; set; }
    public string achievement { get; set; }
}

接口

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();
}

存储库

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.

装订

kernel.Bind(typeof(IAdminRepository<>)).To(typeof(AdminRepository<>));

我还尝试使用附加行绑定无效:

kernel.Bind<IAdminRepository<tAchievement>>().To<AdminRepository<tAchievement>>();

我假设我错过了一些简单的事情。

我的参考文献中有Ninject,Ninject.Web.MVC和Ninject.Web.Common - 全部取自NuGet。

Stack Trace如下:

[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

_____________编辑部分回答_____________

从头开始重新创建一个项目并遇到同样的错误我注意到我使用的一些其他软件包的版本已经改变了。我正在使用&#34; Twitter Bootstrap for MVC&#34;由Eric Hexter作为我的主要显示器,这是我之前使用过的Twitter Bootstrap的更高版本。我不确定这是否会导致问题,但旧工作项目中文件夹的布局与新版本不同。

在Trevor Pilley的评论之后,这个答案给了我一个不错的指针: Ninject + MVC3 is not injecting into controller

在我以前的工作项目中,以下内容位于Web.config文件中,但不在新项目中。如果我添加它,代码可以工作,但Twitter Bootstrap布局仍然存在问题 - 可能来自新的.css文件 - 我会留下问题,以防万一有人可以改进这个作为答案。< / p>

(实体框架结束标记留在Web.config中显示位置)

  </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>

_________编辑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();
    }
}

1 个答案:

答案 0 :(得分:0)

您需要告诉MVC运行时使用Ninject来解析您的控制器,最简单的方法是安装MVC extension for Ninject