我有一项服务,用于创建,保存和发送不同类型的订单,其中某些类型的订单可以携带附件。 该服务将使用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方法问题的难题?
答案 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来清楚地说明这个问题,那么提供比上述更具体的建议是很难或不可能的。完全有可能比现在使用的方法更好,但没有更多的背景,就不可能说出它会是什么。