概要
タイトル通りです。
ASP.netでMVCによるWebブラウザで閲覧できるページと、WebAPIによるAPIアクセスを可能とするWebサービスを作っており、SimpleInjectorで各機能への依存性の注入を行っております。
Webページで見られる機能については正常に動作するものの、WebAPIの方は、
System.ArgumentException が発生しました。 Message: 例外がスローされました: 'System.ArgumentException' (System.Core.dll の中) 追加情報:型 'MyWebApp.Controllers.GenerateUniqueIdController' には既定のコンストラクターがありません
と例外が発生しております。
なお、.netFramework 4で制作しております。
詳細
クリーンアーキテクチャを設計・開発に導入し、依存性注入を行ってテストの容易性を高めるということを行っていたりしております。
そのため、各ユースケースやリポジトリに対してはSimpleInjectorを利用し、データの実態を注入しているのですが、[概要]の例外が発生し、APIを作ることができていない状態です。
やりたいこと
この例外を解決し、WebAPIを設置し、Webページ側からJavaScriptのAjaxなどでAPIを叩き、値を取得するようにしたいです。
ソースコード(一部)
「Front」プロジェクト内
Global.asax.cs
csharp
1/* using 省略 */ 2 3namespace MyWebApp 4{ 5 public class MvcApplication : HttpApplication 6 { 7 protected void Application_Start() 8 { 9 GlobalConfiguration.Configure(WebApiConfig.Register); 10 AreaRegistration.RegisterAllAreas(); 11 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 12 RouteConfig.RegisterRoutes(RouteTable.Routes); 13 BundleConfig.RegisterBundles(BundleTable.Bundles); 14 XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config"))); 15 DIRegister.Regist(); 16 DapperModelInitializer.Initialize(); 17 } 18/* 以下略 */
Controller/GenerateUniqueIdController.cs
csharp
1/* using省略 */ 2 3namespace MyWebApp.Controllers 4{ 5 public class GenerateUniqueIdController : ApiController 6 { 7 private readonly IGenerateUniqueIdUseCase _IdUseCase; 8 9 public GenerateUniqueIdController(IGenerateUniqueIdUseCase getUseCase) 10 { 11 this._IdUseCase = getUseCase; 12 } 13 14 public string Get() 15 { 16 var request = new GenerateUniqueIdUseCaseRequest(); 17 var response = _IdUseCase.Execute(request); 18 19 return response.Id; 20 } 21 } 22}
「DI」プロジェクト内
DIRegister
csharp
1/* using省略 */ 2namespace MyWebApp.DI 3{ 4 public static class DIRegister 5 { 6 public static void Regist() 7 { 8 var container = new Container(); 9 container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 10 11 container.Register<IAdminUserLoginUseCase, AdminUserLoginUseCaseInteractor>(); 12 container.Register<IGetCustomerLoginUseCase, GetCustomerLoginUseCaseInteractor>(); 13 14 /* 他、UseCaseの実体を注入 */ 15 16 container.Register<IGenerateUniqueIdUseCase, GenerateUniqueIdUseCaseInteractor>(); 17 18 container.Register<IAdminUserRepository, AdminUserRepository>(); 19 container.Register<ICustomerRepository, CustomerRepository>(); 20 // UniqueIdUseCaseで利用するRepositoryはCustomerRepositoryに組み込んでいるので書いていない。 21 22 23 container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 24 container.Verify(); 25 DependencyResolver.SetResolver(new SimpleInjectionDependencyResolver(container)); 26 } 27 } 28}
質問者の予想とやったこと
予想
SimpleInjectorのライフスタイルの設定がMVCとWebAPIで違うものを使うべきだと考えている。
やったこと
- 別のライフスタイルを持つコンテナを二つ用意して注入したが、MVCで制作したWebページが例外で表示されなくなってしまった。
- デフォルトライフスタイルを
AsyncScopedLifestyle
に変更したが、同じくMVCで制作したWebページが例外で表示されなくなってしまった。
以上です。
もしよろしければ回答いただけると幸いです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/04 04:05
2019/10/06 09:58
2019/10/06 10:06