Ninject で IDocumentSession の依存関係をスコープするのに問題があります。
バスがコマンドを実行するたびに、新しい IDocumentSession が必要になります。ファクトリによって作成されたコマンド ハンドラには、同じ IDocumentSession のインスタンスが挿入されている必要があります。バスを CallScope に入れるとうまくいくと思いましたが、AsFactory は CallScope を壊すと思いますか? どうすればこれを達成できますか?
public class Bus : IBus
{
private readonly ICommandHandlerFactory _factory;
private readonly IDocumentSession _session;
public Bus(ICommandHandlerFactory factory, IDocumentSession session)
{
_factory = factory;
_session = session;
}
public void ExecuteCommand<T>(T command) where T : class
{
var handler = _factory.Create<T>();
handler.Handle(command);
_session.SaveChanges();
}
}
public class ActivateAccountCommandHandler : ICommandHandler<ActivateAccountCommand>
{
private readonly IDocumentSession _session;
public ActivateAccountCommandHandler(IDocumentSession session)
{
_session = session;
}
public void Handle(ActivateAccountCommand command)
{
// Do something
}
}
kernel.Bind<IDocumentStore>().ToMethod(ctx => DocumentStore.Get()).InSingletonScope();
kernel.Bind<IDocumentSession>().ToMethod(ctx => ctx.Kernel.Get<IDocumentStore>().OpenSession());
kernel.Bind<ICommandHandlerFactory>().AsFactory();
kernel.Bind<IBus>().To<Bus>().InCallScope();
コンテキスト保存も試しましたが、違いはありません。
kernel.Bind<IDocumentSession>().ToMethod(ctx => ctx.ContextPreservingGet<IDocumentStore>().OpenSession());