2

Web API コントローラーに接続されているフィルターの 1 つで、datacontext が時々破棄されるという問題があります。これは、Web API コントローラーのフィルターをセットアップする正しい方法ですか? また、データコンテキストが時々破棄されるのはなぜですか?

DbContext が破棄されているため、操作を完了できません。

Global.asax

GlobalConfiguration.Configuration.Filters
               .Add(new ApiValidationFilter(kernel.Get<IApiAuthenticationService>()));

kernel.Bind<IDatabaseFactory>()
      .To<DatabaseFactory>()
      .InScope(q => HttpContext.Current ?? StandardScopeCallbacks.Thread(q));

ApiValidationFilter.cs

public class ApiValidationFilter : System.Web.Http.Filters.IActionFilter
    {
            private readonly IApiAuthenticationService _apiAuthenticationService;

            public ApiValidationFilter(
                IApiAuthenticationService apiAuthenticationService)
            {
                _apiAuthenticationService = apiAuthenticationService;
            }
4

2 に答える 2

1

Filter バインディング構文を使用する必要があります。Ninject はフィルターの有効期間を処理し、フィルターのコンストラクター インジェクションも処理します。

https://github.com/ninject/ninject.web.mvc/wiki/Filter-configurations

また、ファクトリを使用する代わりに、Ninject にデータ コンテキストの有効期間の管理も処理させます。

kernel.Bind<MyContext>().ToSelf().InRequestScope();  

または、より良いテスト容易性が必要な場合は、インターフェイスからコンテキストを派生させ、それにバインドすることができます。InRequestScope は、コンテキストが Web リクエスト全体で有効であることを確認し、リクエストが完了すると自動的に破棄されます。覚えておく必要はありません。また、単一のリクエストより長くリクエストを保持することによるメモリ リークもありません。

ここで例を見ることができます:

ASP.NET MVC 3 とグローバル フィルター インジェクション

于 2012-09-29T19:34:43.737 に答える
0

私は最終的に次のことに頼らなければなりませんでしたが、何もうまくいきませんでした。

var apiRepository = new ApiRepository(new DatabaseFactory());
                var apiAuthenticationService = new ApiAuthenticationService(apiRepository, new UnitOfWork(new DatabaseFactory()), new ValidationProvider(null));
于 2012-10-25T22:11:22.117 に答える