繁体   English   中英

接口实现-为参数创建接口

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM