アプリケーション内の多数の管理リストに対して、かなり単純な汎用リポジトリを使用しようとしています。管理者ユーザーの機能は、他の場所でルックアップとして使用するためにリストを最新の状態に保つための CRUD です。
次の形式のエラーが発生し続けます。
タイプ 'WhatWorks.Controllers.AchievementController' のコントローラーを作成しようとしたときにエラーが発生しました。コントローラーにパラメーターなしのパブリック コンストラクターがあることを確認します。
SOに関する非常に多くの投稿とGoogleで見つけたブログを読みましたが、答えが見つかりません(少なくとも、別の問題である可能性のある答えとして私にとって意味のあるものは何もありません...)
私のコードは次のとおりです。
コントローラ
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 Bootstrap を取り込みます。これが問題の原因かどうかはわかりませんが、古い作業中のプロジェクトのフォルダーのレイアウトが新しいものとは異なります。
この回答は、Trevor Pilley によるコメントの後に適切な指針を与えてくれました: Ninject + MVC3 is not injecting into controller
私の以前の作業プロジェクトでは、次は Web.config ファイルにありましたが、新しいプロジェクトにはありません。追加すると、コードは機能しますが、Twitter Bootstrap レイアウトにまだ問題があります (おそらく新しい .css ファイルによるものです)。誰かがこれを回答として改善できる場合に備えて、質問を開いたままにします。
(Entity Framework の終了タグは、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();
}
}