[英]Interface Implementation - Creating Interface for Parameters
这是我在阅读接口实现(接口隔离原理)时首先想到的
思想
引入一个新接口,该接口将表示方法参数而不是传递单个参数值。 如下所示:
interface IServiceProviderInput
{
string Username { get; }
string Password { get; }
string AgentId { get; } // XYZServiceProvider needs this.
// Similarly add props here to represent new parameters
// required by future service provider implementations.
}
interface IServiceProvider
{
bool Authenticate(IServiceProviderInput parameters);
}
class ABCServiceProvider : IServiceProvider
{
public bool Authenticate(IServiceProviderInput parameters)
{
return true;
}
}
class EFGServiceProvider : IServiceProvider
{
public bool Authenticate(IServiceProviderInput parameters)
{
return true;
}
}
class XYZServiceProvider : IServiceProvider
{
public bool Authenticate(IServiceProviderInput parameters)
{
return true;
}
}
题
这有道理还是有什么缺陷? 有什么想法吗?
编辑
为XYZ提供程序添加更多特定接口的另一种想法:
interface IServiceProviderInput
{
string Username { get; }
string Password { get; }
}
interface IXYZServiceProviderInput : IServiceProviderInput
{
string AgentId { get; }
}
class XYZServiceProvider : IServiceProvider
{
public bool Authenticate(IXYZServiceProviderInput parameters)
{
return true;
}
}
我不确定这两种想法都是错误的或有缺陷的,因此是一个问题。
您当然可以这样做,但是除非所有方法都接受并且需要接口定义的所有参数,否则这是一个糟糕的主意。 永远不要将更多信息传递给方法,否则就不需要它,否则,您将不知道需要什么工作以及接口没有什么要求。
我对实现的唯一问题是,为什么您对XYZServiceProvider
使用相同的身份验证方法,却没有实现您定义的IServiceProvider
接口?
问题是当您有正在调用IServiceProvder
进行身份验证的客户端时,它们将无法使用XYZServiceProvider
而只能使用其他两个。 如果他们想使用XYZServiceProvider
,则需要按名称指定(紧密耦合)。
如果要更改程序,并从XYZServiceProvider
切换到EFGServiceProvider
进行身份验证,则各个客户端也需要更改其代码,以便他们可以使用新的提供程序。 在尝试为服务创建单元测试时,这尤其麻烦,因为您将必须分别为XYZServiceProvider
创建测试夹具。
如果您要为XYZServiceProvider
提供另一种服务类型,我建议您创建另一个接口,例如用于其他服务的IServiceProvider
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.