NuGetのNinject.Web.WebApi-RC
パッケージを使用しているため、属性とフィルタを使用して単純なリポジトリパターンを推奨hereとして使用しています。Ninject WebAPI DbContextが破棄されたため、操作を完了できません
これは最初のリクエストでは機能しますが、DbContext
がリクエストスコープにあるため、後続のすべてのリクエストに配置されます。ここで
は私の属性である:ここでは
public class CommunicationKeyValidationAttribute : FilterAttribute
{
}
は私のフィルタである:ここでは
public class CommunicationKeyValidationFilter : AbstractActionFilter
{
public CommunicationKeyValidationFilter(IRepository repository)
{
this.repository = repository;
}
public override void OnActionExecuting(HttpActionContext actionContext)
{
// do stuff
}
}
は私のリポジトリです。ここ
public class Repository : IRepository
{
public Repository(MyDbContext dbContext)
{
this.dbContext = dbContext;
}
}
は私のNinjectバインディングです:
this.Kernel.Bind<MyDbContext>().ToSelf().InRequestScope();
this.Kernel.Bind<IRepository>().To<Repository>().InRequestScope();
this.Kernel.BindHttpFilter<CommunicationKeyValidationFilter>(FilterScope.Action)
.WhenActionMethodHas<CommunicationKeyValidationAttribute>()
.InRequestScope();
私のコントローラは、次のようになります。ここ
public class HomeController
{
[CommunicationKeyValidation]
public ActionResult Index()
{
// do stuff
}
問題CommunicationKeyValidationFilter
上のコンストラクタは最初の要求に応じて呼び出されていることです。フィルタを解決しようとするたびに、このフィルタを構築する方法がありますか?
は:(?バグ)ので、私は、この機能によって引き起こされるweb.apiにNinjectのバグだと思います。 Web.Api自体がフィルタをキャッシュしているようです。私は[autofac web.api integration](https://code.google.com/p/autofac/wiki/WebApiIntegration)でこれを見つけました。「MVCのフィルタプロバイダとは異なり、 Web APIのフィルタ属性では、フィルタインスタンスをキャッシュしないように指定することはできません。つまり、Web APIのすべての**フィルタ属性は、アプリケーションのライフタイム全体にわたって存在する実質的にシングルトンのインスタンスです** ** " – nemesv
うん、私は同じ記事を読むと信じています。私は、誰かがカスタムフィルタプロバイダを書くか、リクエストごとに新しいインスタンスを作成するものを書くことでこれに取り組んでいたのだろうかと思いました。 –
興味深いことに、NinjectはWeb.APIの2つのフィルタプロバイダ 'DefaultFilterProvider'と' NinjectFilterProvider'を提供しています... – nemesv