C#接口继承与显式类型转换

时间:2015-03-27 11:07:46

标签: c# inheritance interface

我有一项服务,用于创建,保存和发送不同类型的订单,其中某些类型的订单可以携带附件。 该服务将使用IExternalService将订单发送到另一个外部服务,IExternalService由具有不同外部端点的其他几个服务使用。

IExternalService包含外部IRepository的getter,用于向外部服务发送订单。

我为这些存储库创建了一个新接口,它将添加附件IRepositoryWithAttachement。

我在下面提供了一些示例代码,其中遗漏了不重要的内容:

interface IRepository //Standard repo used by different external services
{
string Create(Order order);
void Update(Order order);
}

带附件的订单使用

interface IRepositoryWithAttachement : IRepository //attachable repo
{
string AddFile(Attachement file);
void UpdateFile(Attachement file);
}

Repo必须发送附件以及订单

public class Repository : IRepositoryWithAttachement {...} 

许多外部服务实施所使用的服务

interface IExternalService 
{
 string Name { get; }
 ....
IRepository Repository { get; }
}

创建,保存和发送订单的主要服务类

public class OrderService
{
public string Create(Order order)
{
...
IExternalService eService = _externalServices.GetExternalService(id);

try
        {                
         eService.Repository.Create(order);
        }
        catch (Exception e)
        {
            ....
        }
 ...
} 

现在这个特定的ordertype将添加附件,当它通过IExternalService获取存储库时,它将返回一个IRepository并尝试调用eService.Repository.AddFile(file),但AddFile方法不存在,因为返回类型是我想要的IRepository。但我的IRepositoryWithAttachement正在扩展IRepository,所以我很困惑如何达到它并且我设法做到了:

 public string AddFile(Attachement file) {

 IExternalService eService = _externalServices.GetExternalService(id);

        try
        {                
                ((IRepositoryWithAttachement ) eService .Repository).AddFile(file); 
        }
        catch (Exception e)
        {               
           ...
        }
 }
}

问题 我这样做错了,还是通过类型转换来解决addfile方法问题的难题?

1 个答案:

答案 0 :(得分:1)

我看到的两个最大问题是:a)您似乎正在使用异常处理来防止未实现所需接口的存储库,以及b)您正在捕获Exception,而不是{{ 1}}和/或其他特定例外,您可以预见并正确处理它们。

恕我直言,更好的实现看起来像这样:

InvalidCastException

更好的方法是根据功能对可用的存储库ID进行分类并限制访问,这样除非您知道存储库实现了必要的接口,否则永远不会调用public string AddFile(Attachement file) { IExternalService eService = _externalServices.GetExternalService(id); IRepositoryWithAttachement repository = eService.Repository as IRepositoryWithAttachement; if (repository == null) { // report error in some appropriate way and return, or throw an // _informative_ exception, e.g. // new NotSupportedException("repository does not support attachments") } repository.AddFile(file); } 方法。然后你可以安全地投射,而不必担心抛出异常。


遗憾的是,如果没有a good, minimal, complete code example来清楚地说明这个问题,那么提供比上述更具体的建议是很难或不可能的。完全有可能比现在使用的方法更好,但没有更多的背景,就不可能说出它会是什么。