C# 如何配置Simple Injector在上下文事务中实现命令处理程序模式

C# 如何配置Simple Injector在上下文事务中实现命令处理程序模式,c#,design-patterns,dependency-injection,inversion-of-control,simple-injector,C#,Design Patterns,Dependency Injection,Inversion Of Control,Simple Injector,我试图在WPF应用程序上应用命令处理程序模式 我在理解如何配置IoC容器(在我的例子中,我使用Simple Injector)以实现这种功能时遇到了一些问题 我想执行一个数据库命令处理程序(在DbContext上执行一些操作),并且每个命令都必须包装在同一上下文上创建的事务中 类似这样的东西(这只是一个例子) 公共类业务用例 { 公共业务案例1() { BusinessCommandParams1 commandParams=新的BusinessCommandParams1(); 使用(var

我试图在WPF应用程序上应用命令处理程序模式

我在理解如何配置IoC容器(在我的例子中,我使用Simple Injector)以实现这种功能时遇到了一些问题

我想执行一个数据库命令处理程序(在
DbContext
上执行一些操作),并且每个命令都必须包装在同一上下文上创建的事务中

类似这样的东西(这只是一个例子)


公共类业务用例
{
公共业务案例1()
{
BusinessCommandParams1 commandParams=新的BusinessCommandParams1();
使用(var db=newdbcontext(connectionString))
{
IDatabaseCommand数据库创建=
新TransactionDatabaseCommandDecorator(新业务命令(db),db);
databaseCreate.Execute(commandParams);
}
}
....
其他商业案例
}
公共接口IDatabaseCommand
{
TResult Execute(TParam commandParam);
}
公共类BusinessCommandParams1
{
//某些属性
}
公共类数据库结果
{
//某些属性
}
公共类BusinessCommand:IDatabaseCommand
{
私有只读DbContext\u context;
公共业务命令(IDbContext上下文)
{
_上下文=上下文;
}
公共数据库结果执行(BusinessCommandParams1 commandParam)
{
//使用上下文
返回新的DatabaseResult();
}
}
公共类TransactionDatabaseCommandDecorator:IDatabaseCommand
{
私有只读IDatabaseCommand\u命令;
私有只读DbContext\u context;
公共TransactionDatabaseCommandDecorator(IDatabaseCommand命令,DbContext上下文)
{
_命令=命令;
_上下文=上下文;
}
公共数据库结果执行(BusinessCommandParams1 commandParam)
{
使用(var事务=_context.Database.BeginTransaction())
{
尝试
{
_command.Execute(commandParam);
Commit();
}
捕获(例外e)
{
控制台写入线(e);
事务。放弃();
投掷;
}
}
}
}
所以基本上,我需要通过使用POOR-MAN-DI来实现类似的东西

公共类业务用例
{
公共业务案例1()
{
BusinessCommandParams1 commandParams=新的BusinessCommandParams1();
使用(var db=newdbcontext(connectionString))
{
IDatabaseCommand数据库创建=
新TransactionDatabaseCommandDecorator(新业务命令(db),db);
databaseCreate.Execute(commandParams);
}
}
....
其他商业案例
}
使用简单的注入器或其他IOC容器

我需要的是实现命令处理程序,将业务案例逻辑包装在单个作用域DbContext中。 为了更好地解释,我需要从容器中获取正确的命令处理程序,该处理程序在定义良好的Dbcontext中执行其逻辑,该Dbcontext将在执行后进行处理

但我不明白如何通过在ioc容器中注册所有类来实现这一点。 我的命令处理程序设计或DI的使用可能有问题

你能给我举个例子或者用正确的方式开车送我吗


提前感谢

Simple Injector允许自动注册泛型类型,如您的命令处理程序。只需调用
容器即可注册所有命令处理程序。注册

container.Register(typeof(IDatabaseCommand)、typeof(BusinessCommand.Assembly);
之后,您可以逐个注册装饰师:

container.RegisterDecorator(
类型(IDatabaseCommand),
typeof(TransactionDatabaseCommandDecorator));
请注意,这样的装饰器在它是泛型类型时工作得最好,因为在这种情况下,简单的注入器可以将它包装在任意
IDatabaseCommand
实现中

有关注册泛型类型和装饰器的更多信息,请阅读我们的优秀文档:


Thk@Steven,这非常有用,我将尝试实现这一点。但我不明白的是如何将命令实际注入到BusinessCase类中。如果我使用构造函数注入,我甚至需要注册DbContext,但如果我注入它,我如何控制DbContext的生存期?我需要的是为命令处理程序实现的每个业务案例拥有一个单一作用域的DbContext…你能给我一些这样的例子吗?看看
ScopedCommandHandlerProxy
在文档部分.Thk,这就是我要找的。非常感谢你!!!!!