IOperationResult как способ получения результата произвольного действия

Довольно часто бывает ситуация, когда нужно получить результат выполнения какого-либо метода. При этом может произойти либо ошибка, тогда желательно получить сообщение (или код) этой ошибки. Но, в то же время, хочется получить итоговый объект, в случае, если метод выполнился без ошибок. Для этого был разработан способ выполнения методов, через IOperationResult.

Реализовано 2 варианта интерфейса. Для случая, если нет необходимости получать результат (методы void) и generic интерфейс.

public interface IOperationResult
{
    bool Success { get; }

    List<string> Messages { get; }
}

Метод, использующий IOperationResult может выглядеть следующим образом

public static IOperationResult<BookResult> Book(int id, string Name, string Email, string Phone)
{
    GamesTimetable game = ById(id);

    if (game == null || !game.IsBookingEnabled || !game.IsEnabled)
        return new OperationResult<BookResult>("AlreadyBooked");
    
    // Продолжение метода...

}

Полный код представлен ниже

public interface IOperationResult
{
    bool Success { get; }

    List<string> Messages { get; }
}

public interface IOperationResult<T>
{
    bool Success { get; }

    List<string> Messages { get; }

    T Object { get; }
}

public sealed class OperationResult<T> : OperationResult, IOperationResult<T> where T : class
{
    public T Object { get; set; }

    public OperationResult(string message) : base(message)
    {
    }

    public OperationResult(List<string> messages) : base(messages)
    {
    }

    public OperationResult(T obj) : base()
    {
        Object = obj;
    }

    static OperationResult()
    {
        OK = new OperationResult<T>("");
    }


    public static OperationResult<T> OK { get; private set; }
}

public class OperationResult : IOperationResult
{
    public static OperationResult OK { get; private set; }

    static OperationResult()
    {
        OK = new OperationResult();
    }

    public OperationResult()
    {
        Messages = new List<string>();
    }

    public OperationResult(List<string> messages)
    {
        Messages = messages;
    }

    public OperationResult(string message)
        : this()
    {
        if (!message.IsEmpty())
            Messages.Add(message);
    }


    public bool Success
    {
        get { return Messages.Count == 0; }
    }

    public List<string> Messages { get; private set; }
}

Класс определен в сборке Oxozle.Utilities и может быть скачан через nuget.

 

Комментарии

comments powered by Disqus