【发布时间】: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 种方法。
- 创建一个
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; }
}
- 添加一个 getter 属性并从提供者具体类中填充它。调用代码将选择提供者的一个实例,并且可以访问此属性。方法的返回类型不会改变。
public interface IProvider
{
Task<bool> SendAsync(ProviderRequest providerRequest);
string ProviderResponse { get; }
}
我应该选择哪种设计?哪里是使用这些设计解决方案的最佳场所?
【问题讨论】:
-
第二种方法不是线程安全的,因此我肯定会使用第一种。
-
我们可以通过添加一个临时依赖来解决它
标签: c# object properties class-design