В настоящее время я занимаюсь рефакторингом существующего DAL, у которого есть фасад, который вызывает пользователь, и внутренний класс, который выполняет фактическую работу в зависимости от поставщику ADO.Net для использования, например, SqlProvider, и я пытаюсь убедиться, что код является СУХИМ, у меня все в порядке, используя Func, поэтому я могу сделать:
return RunCommand(c => c.ExecuteNonQuery(commandText, parameters));
А метод RunCommand выглядит так:
private T RunCommand(Func toRun)
{
return toRun(CreateCommand());
}
CreateCommand ()
просто создает объект команды для использования, это затем позволяет мне иметь единственный метод, который обрабатывает все вызовы, которые просто возвращают ожидаемый тип, например DataSet, DataReader и т. Д.
У меня проблема в том, что несколько вызовов фасада предоставляют параметр out
, который, как я знаю, должен иметь возможность удалить повторяющийся код, если я могу использовать делегат, но после большого количества поисков в Google и экспериментируя, я так и не понял, как это сделать. Код такой:
Commands commands = CreateCommand();
return commands.ExecuteNonQuery(out cmd, commandText, parameters);
Я бы действительно хотел позвонить:
return RunCommand(c => c.ExecuteNonQuery(out cmd, commandText, parameters));
Я видел этот существующий вопрос, но, хоть убей, я не могу понять, как повернуть это в то, что мне нужно.
Этот делегат может показаться мне тем, что мне нужно частный делегат V TestOutParameter
но код У меня есть за то, что это неправильно:
private V RunCommand(TestOutParameter commandToExecute)
{
DbCommand cmd;
return (V)commandToExecute(CreateCommand(), out cmd);
}
Кто-нибудь может мне помочь, так как это сводит меня с ума уже неделю!