作为最佳实践,如何继续执行所有实现以特定方式处理异常。例如,我们说我有以下界面
public interface IApplicationProvider<TData> : IDisposable{
TData Get(string appName);
}
public abstract ApplicationProviderBase<MyDTO> {
public abstract MyDTO Get(string appName);
}
public class SomeApplicationProvider: ApplicationProviderBase {
public MyDTO Get(string appName){
...
if (somecondition == somecondition)
throw new InvalidOperation("Application could not be fetched due to a custom error");
}
}
在用户界面中,它将处理所有&#34; InvalidOperations&#34;并将消息显示给用户。但是,另一种方法是创建一个自定义对象,它将包装数据和任何错误消息。
public OperationObject Get(string appName){
var operationObject = new OperationObject();
if (somecondition == somecondition)
operationObject.ErrorMessage = "message";
else
operationObject.Data = MyDTO
}
编辑:基本上我想让所有提供商都有办法提供操作失败的原因。
答案 0 :(得分:1)
我过去处理这个问题的一种方法是利用一个简单的操作结果类。基本上你所做的是将你的成功和失败包装在一个对象中,该对象包含操作的状态,它返回的任何数据,以及描述发生的事情的消息。这是一个样本
public enum OperationStatus { Success, Failure, Pending }
public class OperationResult<T>
{
public T Data { get; private set; }
private OperationStatus opStatus;
public string Status
{
get
{
return this.opStatus.ToString();
}
private set
{
var names = Enum.GetNames(typeof(OperationStatus));
if (names.Contains(value))
{
this.opStatus = (OperationStatus)Enum.Parse(typeof(OperationStatus), value);
}
else
{
throw new Exception("Illegal Status Type");
}
}
}
public string Message { get; private set; }
public bool IsSuccess
{
get
{
return this.Status == OperationStatus.Success.ToString();
}
}
public OperationResult(OperationStatus status, string message, T data)
{
this.Data = data;
this.Status = status.ToString();
this.Message = message;
}
public static implicit operator bool(OperationResult<T> result)
{
return result.IsSuccess;
}
}
我将向您推荐一篇博文,其中讨论了类似的方法响应技术http://www.appvnext.com/blog/2015/12/10/outcome-basics-part-i。
使用这种技术将为您的提供商提供一种约定,以传达任何异常和成功。