【发布时间】:2020-10-30 02:22:46
【问题描述】:
我不明白如何使用 DI 容器在装饰者和装饰者之间共享实例。
以下示例说明了我的问题。 context 实例在TransactionCommandDecorator 和Command 服务之间共享。
var context = UowFactory.GetUnitOfWork();
var command = new TransactionCommandDecorator(
context,
new Command(context));
command.Execute(new CommandParams { });
context.dispose();
基本上,我需要有很多与数据库交互并调用存储库的命令。然后我想通过使用包装命令服务的装饰器来应用事务。
问题是我不知道如何在装饰者和被装饰者之间共享上下文(如示例中所示),因为每次执行命令时我都需要一个新的 DbContext 实例。
您能否解释一下我如何通过在 Scope 流动的上下文中使用 Simple Injector 来使其工作 (ScopedLifestyle.Flowing)。
装饰器和装饰器实现的一个可能示例
命令示例:
public Command(IUnitOfWork uow) => _uow = uow;
public DbResult Execute(CommandParams args)
{
_uow.Repo1.Add(args.Item);
_uow.Repo1.Add(args.Item2);
_uow.Repo1.Remove(args.Item3);
}
事务命令装饰器:
public class TransactionCommandDecorator : ICommand
{
public TransactionCommandDecorator(IUnitOfWork uow, ICommand command)
{
_uow = uow;
_command = command;
}
public DbResult Execute(commandParams args)
{
try
{
var transaction = _uow.GetContext().Database.GetTransaction();
var ret = _command.Execute(args);
if (!ret.Success)
{
transaction.Discard();
return;
}
transaction.Commit();
}
catch
{
transaction.Discard();
}
finally
{
transaction.Dispose();
}
}
}
【问题讨论】:
标签: c# dependency-injection command inversion-of-control simple-injector