C # ищет новый инструмент для панели инструментов, как шаблон этого кода - PullRequest
1 голос
/ 31 марта 2010

Все, что у меня есть кое-что, что я пытался сделать некоторое время, и пока не нашел хорошей стратегии для этого, я не уверен, что C # может даже поддержать то, что я пытаюсь сделать.

Пример. Представьте себе шаблон, подобный этому, повторяющийся в всеобъемлющей функции cocept кода менеджера. Возвращает результат, состоящий из флага успеха и списка ошибок.

       public Result<Boolean> RemoveLocation(LocationKey key)
        {
           List<Error> errorList = new List<Error>();
           Boolean result = null;
           try{
                result  = locationDAO.RemoveLocation(key);
           }catch(UpdateException ue){
               //Error happened less pass this back to the user!
               errorList = ue.ErrorList;
           }

           return new Result<Boolean>(result, errorList);
        }

Нужно превратить его в шаблон, подобный приведенному ниже, где Do Something - это какой-то вызов (предпочтительно не статический), который возвращает логическое значение. Я знаю, что могу сделать это в смысле стека, но я действительно ищу способ сделать это с помощью ссылки на объект.

* +1007 *

Если вам понадобится дополнительная информация, дайте мне знать.

Мне интересно посмотреть, что может придумать кто-то еще.


Решение Марка, примененное к коду выше

    public Result<Boolean> CreateLocation(LocationKey key)
    {
        LocationDAO locationDAO = new LocationDAO();
        return WrapMethod(() => locationDAO.CreateLocation(key));
    }


    public Result<Boolean> RemoveLocation(LocationKey key)
    {
        LocationDAO locationDAO = new LocationDAO();
        return WrapMethod(() =>  locationDAO.RemoveLocation(key));
    }


    static Result<T> WrapMethod<T>(Func<Result<T>> func)
    {
        try
        {
            return func();
        }
        catch (UpdateException ue)
        {
            return new Result<T>(default(T), ue.Errors);
        }
    }

Ответы [ 3 ]

1 голос
/ 31 марта 2010

Что-то вроде:

public Result<Boolean> RemoveLocation(LocationKey key)
{
    return WrapMethod(() => locationDAO.RemoveLocation(key));
}
static Result<T> WrapMethod<T>(Func<T> func) {
    try
    {
        return new Result<T>(func());
    }
    catch (SomeExceptionBase ex)
    {
        return new Result<T>(ex.ErrorList);
    }
    catch (Exception ex)
    {
        return new Result<T>((List<Error>)null);
    }
}

и (показан минимум)

class Result<T>
{
    private Result(bool isError, T value, List<Error> erors) { }
    public Result(T value) : this(false, value, null){ }
    public Result(List<Error> errors) : this(true, default(T), errors) { }
}
class SomeExceptionBase : Exception
{
    public List<Error> ErrorList { get; private set; }
}

(хотя, если бы у меня было , чтобы сделать это, я, вероятно, сделал бы что-то более интересное с исключениями, которые не были бы SomeExceptionBase)

0 голосов
/ 31 марта 2010
static Result<T> WrapMethod<T>(Func<LocationDao, Result<T>> func) 
{ 
    try 
    { 
        var l = new LocationDao();
        return func(l); 
    } 
    catch (UpdateException ue) 
    { 
        return new Result<T>(default(T), ue.Errors); 
    } 
} 
public Result<Boolean> RemoveLocation(LocationKey key)     
{                  
    return WrapMethod((l) =>  l.RemoveLocation(key));     
} 
0 голосов
/ 31 марта 2010

У нас есть следующее в нашем проекте, это выглядит очень похоже

        public TResult DoCall<TResult,TProvider>(Func<TProvider, TResult> action) where TProvider : class, IProvider
        {
            TResult ret = default(TResult);
            try
            {
                var prov = (TProvider) ModelManagerProvider.GetProviderByType(typeof(TProvider));
                ret = action(prov);
            }
            catch (Exception ex)
            {
                ThrowErrorTool.ThrowError(ex);
            }
            return ret;
        }

и вот как мы это называем

        public bool UpdateAdverseEventSection(AdverseEventsDTO aeDTO)
        {
            return DoCall((AdverseEventsProvider r) => r.UpdateAdverseEventSection(aeDTO));
        } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...