NInject.Web.MvcでNInjectを使用しています。
まず、同じWebリクエスト中に、インスタンスをIPostRepository
コントローラーとカスタムモデルバインダーの間で共有する簡単なテストプロジェクトを作成しました。私の実際のプロジェクトではIEntityChangeTracker
、同じオブジェクトグラフにアクセスする2つのリポジトリが効果的に存在するという問題が発生しているため、これが必要です。したがって、テストプロジェクトを単純にするために、ダミーのリポジトリを共有しようとしています。
私が抱えている問題は、それが最初のリクエストで機能することであり、それだけです。関連するコードは以下のとおりです。
NInjectModule:
public class PostRepositoryModule : NinjectModule
{
public override void Load()
{
this.Bind<IPostRepository>().To<PostRepository>().InRequestScope();
}
}
CustomModelBinder:
public class CustomModelBinder : DefaultModelBinder
{
[Inject]
public IPostRepository repository { get; set; }
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
repository.Add("Model binder...");
return base.BindModel(controllerContext, bindingContext);
}
}
public class HomeController : Controller
{
private IPostRepository repository;
public HomeController(IPostRepository repository)
{
this.repository = repository;
}
public ActionResult Index(string whatever)
{
repository.Add("Action...");
return View(repository.GetList());
}
}
Global.asax:
protected override void OnApplicationStarted()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.Add(typeof(string), kernel.Get<CustomModelBinder>());
}
この方法で行うと、実際にIPostRepository
は、共有インスタンスではなく、の2つの別個のインスタンスが作成されます。モデルバインダーに依存関係を注入することに関して、私が見逃していることがここにあります。上記の私のコードは、 NInject.Web.Mvc wikiで説明されている最初のセットアップ方法に基づいていますが、両方を試しました。
2番目の方法を使用した場合、IPostRepository
最初のWebリクエストに対してのみ共有され、その後はデフォルトでインスタンスを共有しませんでした。ただし、それが機能するようになったときDependencyResolver
は、NInjectで同じことを行う方法を理解できなかったため(カーネルがNInjectMVC3クラスに隠れているため)、デフォルトを使用していました。私はそうしました:
ModelBinders.Binders.Add(typeof(string),
DependencyResolver.Current.GetService<CustomModelBinder>());
これが初めて機能した理由は、これがNInjectを介して解決されていないためだと思います。したがって、ライフサイクルは実際にはMVCによって直接処理されています(ただし、依存関係をどのように解決しているかはわかりません)。
では、モデルバインダーを適切に登録し、NInjectに依存関係を注入させるにはどうすればよいですか?