2016-03-03 6 views
2

У меня есть следующие модели:Возврат ошибки из моделей

internal static List<Contracts.DataContracts.Report> GetReportsForSearch(string searchVal, string searchParam) 
    { 
     var param1 = new SqlParameter("@SearchVal", searchVal); 
     var ctx = new StradaDataReviewContext2(); 
     var reports = new List<Contracts.DataContracts.Report>(); 

     try 
     { 
    //Validate param1 here and return false if the requirment are not met 
     } 
    catch(Exception e) 
    { 
    //Throw 
    } 
} 

param1 здесь Является значение, введенное пользователем, и я хочу, чтобы проверить его здесь, и если требования не будут выполнены, я хочу, чтобы возвращать ошибка.

Но как я могу вернуть ошибку здесь из модели? Метод Is типа List, и я не могу не просто написать return false в этом методе.

Любое предложение, как это сделать?

ответ

1

Хорошо, что вы не думали о том, чтобы выбрасывать исключение, когда требования не выполняются. Мы не должны использовать исключения для управления потоком программы.

У меня есть два варианта, на мой взгляд:

1. использовать объекты

Измените метод GetReportsForSearch к следующей подписью:

internal static List<Contracts.DataContracts.Report> GetReportsForSearch(string searchVal, 
                 string searchParam, ReportRequestor requestor) 
{ 
    var param1 = new SqlParameter("@SearchVal", searchVal); 
    var ctx = new StradaDataReviewContext2(); 
    var reports = new List<Contracts.DataContracts.Report>(); 

    try 
    { 
     //Validate param1 here and call RequirementsAreNotMet method if the requirements are not met 
     requestor.RequirementsAreNotMet(); 
    } 
    catch(Exception e) 
    { 
    //Throw 
    } 
} 

И затем вы можете реализовать код, ответственный для обработки этой ситуации в ReportRequestor класс

public class ReportRequestor 
{ 
    public void RequiremenrsAreNotMet() 
    { 
     //code which handle situation when requiremenets are not met 
    } 
} 

2. Используйте тип возвращаемого значения в качестве индикатора состояния

В этом случае, если требования не будут выполнены, вы должны создать ReportGenerationStatus объект с HasResult флаг установлен в ложь. В другом случае просто установите HasResult в true, а также задайте соответствующие результаты. Это несколько подражает Option типа, известного из функциональных языков

internal static ReportGenerationStatus GetReportsForSearch(string searchVal, string searchParam) 
{ 
    //code for your method 
} 

public class ReportGenerationStatus 
{ 
    public List<Contracts.DataContracts.Report> Result { get; set; } 
    public bool HasResult { get; set; } 
} 
Смежные вопросы