代码之家  ›  专栏  ›  技术社区  ›  melkisadek

与通用存储库MVC的Ninject绑定在无参数构造函数上返回错误

  •  1
  • melkisadek  · 技术社区  · 12 年前

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

    我一直收到一个表格错误:

    尝试创建类型为的控制器时出错 “WhatWorks.Controller.AchievementController”。确保 控制器有一个无参数的公共构造函数。

    我读了很多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。

    堆栈跟踪如下所示:

    [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
    

    _____________使用部分答案编辑_____________

    在从头开始重新创建一个项目并遇到同样的错误后,我注意到我正在使用的一些附加包的版本已经更改。我使用Eric Hexter的“Twitter Bootstrap for MVC”作为我的主要展示,这是一个比我以前使用的更新版本的Twitter Bootstraps。我不确定这是否是造成问题的原因,但旧工作项目中文件夹的布局与新项目不同。

    在特雷弗·皮利的评论之后,这个答案给了我一个不错的提示: Ninject + MVC3 is not injecting into controller

    在我以前的工作项目中,以下内容在Web.config文件中,但不在新项目中。如果我添加它,代码是有效的,但Twitter Bootstrap布局仍然存在问题——可能来自新的.css文件——我将保留这个问题,以防有人可以对此进行改进。

    (实体框架关闭标记留在中以显示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>
    

    _________编辑全局.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 回复  |  直到 9 年前
        1
  •  0
  •   Trevor Pilley    12 年前

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