c# - 如何处理范围性质的服务,如 DI 和 IOC 环境中的事务

标签 c# transactions dependency-injection scope ioc-container

假设您的代码通过任何依赖项的构造函数注入(inject)为 DI 和 IOC 正确设计。那么在组合根部是否使用 IOC 容器或 DI-by-hand 对于这个问题来说并不重要。我想。

无论如何,我一次又一次地发现自己在思考如何最好地处理基于范围的服务,比如事务或其他明显的 transient 操作。我想遵守以下约束:

  • 不要让依赖接口(interface)成为IDisposable - 这是一个有漏洞的抽象,只有实际的实现类型(以及位于组合根的 fiddler )应该关心。
  • 不要在图表深处使用静态服务定位器类型来解决依赖关系 - 仅通过构造函数注入(inject)和解决。
  • 不要将 IOC 容器(如果有的话)作为图形的依赖项向下传递。

为了能够使用using,我们需要IDisposable,但由于依赖接口(interface)不应该是IDisposable,你如何获得围绕它以获得作用域行为?

最佳答案

在这种情况下,我会注入(inject)一个服务工厂来创建这些范围内的服务,并让服务接口(interface)派生自 IDisposable。这样,工厂将负责创建适当的服务实例,并且是决定返回哪个服务实现的唯一点。您不需要在任何地方注入(inject)作用域服务。

public interface ITransaction : IDisposable
{
}

public interface ITransactionFactory 
{
    ITransaction CreateTransaction();
}

public class Foo
{
    private readonly ITransactionFactory transactionFactory;

    public Foo(ITransactionFactory transactionFactory)
    {
        this.transactionFactory = transactionFactory;            
    }

    public void DoSomethingWithinTransaction()
    {
        using(ITransaction transaction = this.transactionFactory.CreateTransaction())
        {
            DoSomething();
        }
    }
}

关于c# - 如何处理范围性质的服务,如 DI 和 IOC 环境中的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5866983/

相关文章:

c# - Telnet 阻塞 C# TCP 服务器

dependency-injection - Sitecore XConnect : an error occurred when trying to create a controller of type 'ContactsController'

nhibernate - 在事务中运行多个 nhibernate session

php - 如何避免 MySQL InnoDB 中的竞争条件?

python - ZODB:transaction.savepoint 向哪里写入数据?

java - 在 POJO 中使用依赖注入(inject)来注入(inject) EJB

entity-framework - 如何使用依赖注入(inject)处理资源

c# - 为什么单声道有时会截断 http 下载?

c# - 为什么这是一个有效的比较

c# - 如何在c#中声明类型