【问题标题】:Should I use response object or property for returning response我应该使用响应对象或属性来返回响应
【发布时间】:2021-06-14 12:09:24
【问题描述】:

我有一个要求,我需要向我们的客户发送 SMS。对于发送 SMS,我们有多个提供商。为此,我设计了一个接口,并通过实现该接口为提供者创建了不同的类

public interface IProvider
{
     Task<bool> SendAsync(ProviderRequest providerRequest);
}

public class Provider1: IProvider
{
     public async Task<bool> SendAsync(ProviderRequest providerRequest)
     {
          //call provider1
          return somethingBool;
     }
}
public class Provider2: IProvider
{
     public async Task<bool> SendAsync(ProviderRequest providerRequest)
     {
          //call provider2
          return somethingBool;
     }
}

我们希望扩展要求以从提供者处取回响应。现在,为了实现这一点,我可以想到 2 种方法。

  1. 创建一个ProviderResponse 对象并将响应映射到它并返回。
public interface IProvider
{
     //Updated interface method just to be concise, this will be a new version of the method 
     Task<ProviderResponse> SendAsync(ProviderRequest providerRequest);
}
// response class
public class ProviderResponse
{
    public bool IsSuccess { get; set; }
    public string ProviderResponse { get; set; }
}
  1. 添加一个 getter 属性并从提供者具体类中填充它。调用代码将选择提供者的一个实例,并且可以访问此属性。方法的返回类型不会改变。
public interface IProvider
{
     Task<bool> SendAsync(ProviderRequest providerRequest);
     string ProviderResponse { get; }
}

我应该选择哪种设计?哪里是使用这些设计解决方案的最佳场所?

【问题讨论】:

  • 第二种方法不是线程安全的,因此我肯定会使用第一种。
  • 我们可以通过添加一个临时依赖来解决它

标签: c# object properties class-design


【解决方案1】:

似乎第一种方法看起来更有效。

  1. 线程安全
    • 我们可以创建一个单例对象并保存多个对象创建
  2. 在响应对象中扩展:
    • 如果我们希望将来有更多来自 Response 的参数,我们可以在对象中创建一个属性。在第二种方法中,我们必须污染接口以添加更多参数。
  3. 在接口中扩展:
    • 假设IProvider 需要另外一个函数来公开具有不同响应和不同参数的函数。然后在第二种方法中IProvider 成为设计问题,ProviderResponse 输出负责哪个功能。

总体感觉,第一种方法在线程安全、设计、性能和可扩展性方面看起来更有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2014-10-28
    • 1970-01-01
    相关资源
    最近更新 更多