如何强制执行抽象以某种方式行事

时间:2016-03-21 01:35:51

标签: c# asp.net-mvc

作为最佳实践,如何继续执行所有实现以特定方式处理异常。例如,我们说我有以下界面

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
    }

编辑:基本上我想让所有提供商都有办法提供操作失败的原因。

1 个答案:

答案 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

使用这种技术将为您的提供商提供一种约定,以传达任何异常和成功。