私のプロジェクトはサービスとリポジトリで構成されています(すべてのリポジトリはdbコンテキストを共有しています)。私のサービス層の1つでは、リポジトリを使用してデータベースに書き込む非同期メソッドがあります。 Webリクエストは、このメソッドがそれを使用する前に終了し、コンテキストを破棄します。このanswerに記載されているように私はNamedScopesを理解しようとしました。私はまだそれを実装する方法を理解しているように見えることはできません。私は自分のプロジェクトがどのように構造化されているかを示し、誰かがコードレベルで助けてくれることを願っています。NamedScopes Ninjectバインディングと非同期(スレッド化)
バインディング
private static void RegisterServices(IKernel kernel)
{
//dbcontext
kernel.Bind<EntityDatabaseContext>().ToMethod(context => new EntityDatabaseContext()).InRequestScope();
//unit of work
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
//repositories
kernel.Bind<IRepository<Account>>().To<Repository<Account>>().InRequestScope();
//services
kernel.Bind<IAuthenticationService>().To<AuthenticationService>().InRequestScope();
}
AuthenticationServiceは
public AuthenticationService(UnitOfWork unitOfWork, IRepository<Account> accountRepository){}
私AuthenticationService内部方法
//this is a background process
public Task SomeMethodAsync(string text)
{
//spin it off into a new task
return Task.Factory.StartNew(() => SomeMethod(text));
}
コンストラクタ・インジェクションを使用しています
SomeMethod
はaccountRepository
を使用します。もう情報が必要な場合は教えてください。 NamedScopesが解決策である場合、スレッドの問題で私を助けてください、私はどのように私のケースでそれを実装するのですか?
基本的に、バックグラウンドプロセスが実行されており、要求スコープのためにninjectによって処分されているコンテキストを使用しています。
達成したいことを具体的に教えてください。メソッドSomeMethodAsyncを非同期でロードするか、またはファッションのようなジョブ内の情報をバックグラウンド処理したいですか? デザインの大きな問題点の1つは、SomeMethodAsyncで直接新しいタスクを開始することです。新しいタスクを開始すると、タスクの実行についての約束はありません。リクエストが終了してからninjectがリクエストスコープ内にすでに配置された後にタスクが実行される可能性があります。 AsyncControllerを使用する場合は、タスクをその上に登録する必要があります。しかし、APIはそれを開始してはならない –
@DanielMarbachそれは私の問題です、タスクは要求が終了した後に実行され、ninjectはコンテキストを破棄します。私は待つように命じる必要があります。これを行う方法がわかりません。 –
@DanielMarbach APIがそれを開始してはならないとはどういう意味ですか? –