如果实现接口调用Dispose,它是否是一个漏洞抽象

Jon*_*Jon 10 .net c# design-patterns dependency-injection loose-coupling

考虑以下代码:

public class MyClass()
{
  public MyClass()
  {    
  }

  public DoSomething()
  {
    using (var service = new CustomerCreditServiceClient())
    {
       var creditLimit = service.GetCreditLimit(
         customer.Firstname, customer.Surname, customer.DateOfBirth);       
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我们现在想重构它以松散地耦合它.我们最终得到这个:

public class MyClass()
{
  private readonly ICustomerCreditService service;

  public MyClass(ICustomerCreditService service)
  {
     this.service= service;
  }

  public DoSomething()
  {
     var creditLimit = service.GetCreditLimit(
       customer.Firstname, customer.Surname, customer.DateOfBirth);       
  }
}
Run Code Online (Sandbox Code Playgroud)

看起来不错吧?现在任何实现都可以使用该接口,一切都很好.

如果我现在说实现是一个WCF类并且重构之前的using语句是有原因的,那该怎么办?ie /关闭WCF连接.

所以现在我们的接口必须实现一个Dispose方法调用,或者我们使用工厂接口来获取实现并在其周围放置一个using语句.

对我来说(尽管这个主题是新的),这似乎是一个漏洞的抽象.我们不得不在代码中添加方法调用,只是为了实现处理内容的方式.

有人可以帮助我理解这一点并确认我是对还是错.

谢谢

Ste*_*ven 5

是的,当你ICustomerCreditService实现它时,它是一个漏洞的抽象IDisposable,因为你现在已经ICustomerCreditService考虑了特定的实现.此外,这向该接口的消费者传达它可以处置该服务,这可能是不正确的,特别是因为通常,资源应该由创建它的人(具有所有权)来处理.将资源注入类(例如,使用构造函数注入)时,不清楚是否给予使用者所有权.

因此,一般来说,负责创建该资源的人应该将其处理掉.

但是,在您的情况下,您可以通过实现ICustomerCreditServiceClient仅在同一方法调用中创建和处置WCF客户端的非一次性实现来简单地防止这种情况发生.这使一切变得更容易:

public class WcfCustomerCreditServiceClient
    : ICustomerCreditServiceClient
{
    public CreditLimit GetCreditLimit(Customer customer)
    {
        using (var service = new CustomerCreditServiceClient())
        {
            return service.GetCreditLimit(customer.Firstname,
                customer.Surname, customer.DateOfBirth);       
        }
    }
}
Run Code Online (Sandbox Code Playgroud)