10

NuGetのパッケージを使用しているため、ここで推奨されているように、属性とフィルターを含む単純なリポジトリ パターンを使用しています。Ninject.Web.WebApi-RC

これは最初のリクエストで機能しますが、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最初の要求でのみ呼び出されることです。フィルターを解決しようとするたびに、ninject にこのフィルターを構築させる方法はありますか?

4

1 に答える 1

16

フィルターは WebApi によってキャッシュされます。WebApi がライフサイクルを管理できるように、それらは一時的な範囲内にある必要があります。ライフサイクルが長いため、ライフサイクルが短い依存関係を持つことはできません。

ただし、できることは、フィルターの実行中にリポジトリを作成することです。このためには、以下を使用してファクトリを注入するのが最善NinjectFactoryExtensionです。

public class CommunicationKeyValidationFilter : AbstractActionFilter
{
    public CommunicationKeyValidationFilter(IRepositoryFactory repositoryFactory)
    {
        this.repositoryFactory = repositoryFactory;
    }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var repository = this.repositoryFactory.CreateRepository();
    }
 }

 public interface IRepositoryFactory { IRepository CreateRepository(); }
 kernel.Bind<IRepositoryFactory>().ToFactory();
于 2013-03-15T15:46:55.287 に答える