C# 帮助创建一个接口

C# 帮助创建一个接口,c#,C#,我开始看到接口相对于抽象类的价值 目前我正在做一个PayPal包装器项目。我们也可能会做谷歌支付,BillMeLater和亚马逊包装。我被要求确定一些我们可以全面使用的共性(方法、属性等等),在我们所做的任何Web服务的大多数Web服务SOAP Wsdl包装项目中 因此,当我编写PayPal包装时,我创建了一个新类来保存从任何PayPal响应收到的错误: public class ApiError { #region Constructors /// <summary&

我开始看到接口相对于抽象类的价值

目前我正在做一个PayPal包装器项目。我们也可能会做谷歌支付,BillMeLater和亚马逊包装。我被要求确定一些我们可以全面使用的共性(方法、属性等等),在我们所做的任何Web服务的大多数Web服务SOAP Wsdl包装项目中

因此,当我编写PayPal包装时,我创建了一个新类来保存从任何PayPal响应收到的错误:

public class ApiError
{

    #region Constructors

    /// <summary>
    /// Disallow default instantiation.
    /// </summary>
    private ApiError()
    {
    }

    internal ApiError(ErrorType error)
    {
        if(error.ErrorCode != null)
        {
            this._errorCode = error.ErrorCode;
        }
    }

    #endregion

    #region member variables

    private string _errorCode = string.Empty;
    private string _erorMessage = string.Empty;

    #endregion

    #region Properties

    public string ErrorCode
    {
        get { return _errorCode; }
        set { _errorCode = value; }
    }

    public string ErrorMessage
    {
        get { return _errorMessage; }
        set { _errorMessage = value; }
    }

    #endregion

}

您可以将共享类型放在单独的共享程序集中:[MyCompany].WebServices.shared

编辑

想想看,你已经有了。[MyCompany].WebServices.Common应该是您共享类型的最佳场所。把它移到那里。或者我误解了您想要做什么?

您可以将共享类型放在单独的共享程序集中:[MyCompany].WebServices.shared]

编辑

想想看,你已经有了。[MyCompany].WebServices.Common应该是您共享类型的最佳场所。把它移到那里。还是我误解了你想做什么?

软件中的每一个问题都可以通过另一个间接层来解决!!!只需添加另一个名为IAPIError的接口,您可以为每个支付服务错误类型实现该接口

interface IRequest
{
   public IApiError Type { get; set; } 
}

软件中的每一个问题都可以通过另一个间接层来解决!!!只需添加另一个名为IAPIError的接口,您可以为每个支付服务错误类型实现该接口

interface IRequest
{
   public IApiError Type { get; set; } 
}

对于每个提供者,准确的错误号和消息将非常具体。因此,虽然可以创建一个公共接口,但它不能提供足够的抽象来以有意义的方式处理错误

我将添加另一个抽象,通过将预期错误(其中一个是“未知错误”作为意外错误的总括)定义为单独的类,甚至定义为一组异常。然后,让每个提供程序返回或使用那些已经与您的应用程序兼容并允许您以相同方式处理所有提供程序的常见错误的提供程序


将这些常见类型放入一个单独的程序集中,该程序集是提供者和使用它们的实际代码都使用的纯“接口”程序集。因此,您可以松散地耦合提供程序,而无需在主应用程序中添加对它们的引用(允许您添加或修改提供程序,而无需重新编译应用程序)。

每个提供程序的确切错误号和消息将非常具体。因此,虽然可以创建一个公共接口,但它不能提供足够的抽象来以有意义的方式处理错误

我将添加另一个抽象,通过将预期错误(其中一个是“未知错误”作为意外错误的总括)定义为单独的类,甚至定义为一组异常。然后,让每个提供程序返回或使用那些已经与您的应用程序兼容并允许您以相同方式处理所有提供程序的常见错误的提供程序


将这些常见类型放入一个单独的程序集中,该程序集是提供者和使用它们的实际代码都使用的纯“接口”程序集。因此,您可以轻松地耦合提供者,而不必在主应用程序中添加它们(允许您在不重新编译应用程序的情况下添加或修改提供程序)。

您应该考虑到APIOrror将取决于特定的Web服务实现。那么,如果APIRERRORS是特定于实现的,那么只使用接口的客户机将如何使用APIRRORS呢

它不能——因为这意味着它与这个特定的实现相耦合


相反,您需要抽象出特定的API错误代码,并定义自己的抽象错误代码。

,您应该考虑到APIOrror将取决于特定的Web服务实现。那么,如果APIRERRORS是特定于实现的,那么只使用接口的客户机将如何使用APIRRORS呢

它不能——因为这意味着它与这个特定的实现相耦合


相反,您需要从特定的API错误代码中抽象出来,然后定义您自己的抽象错误代码。

那么在这种情况下,该类型必须更改为更通用的基类,以便我也可以在每个包装器项目中扩展它…我想在这种情况下,该类型必须更改为更通用的基类,以便我也可以在每个包装器项目中扩展它…我我想我不明白。那么IApiError是怎么知道我的APIRERROR混凝土类型的呢?反过来说。具体的APIRROR类实现IApiError。实现IRequest的任何类都会知道它应该返回什么类型的APIRERROR对象,并且会这样做。啊,我明白了。因此,在实现IRequest的任何项目中,我都会有一个ApiResponse类。由于它实现了IRequest,它还必须实现IApiError,因此我的ApiResponse类必须在IApiError中具有任何属性?为什么我不能只拥有一个实现直接IApiError的APIRERROR自定义类?为什么是鸟巢?那很酷但是我“我想要一个数组,因为API响应可能会返回多个错误,而不仅仅是一个。我不明白。那么IApiError是怎么知道我的APIRERROR混凝土类型的呢?反过来说。具体的APIRROR类实现IApiError。实现IRequest的任何类都会知道它应该返回什么类型的APIRERROR对象,并且会这样做。啊,我明白了。因此,在实现IRequest的任何项目中,我都会有一个ApiResponse类。由于它实现了IRequest,它还必须实现IApiError,因此我的ApiResponse类必须在IApiError中具有任何属性?为什么我不能只拥有一个实现直接IApiError的APIRERROR自定义类?为什么是嵌套?这很酷,但我想要一个数组,因为API响应可以