Рефакторинг дубликата кода в ядре C # net - PullRequest
0 голосов
/ 07 октября 2019

У меня есть существующий код контроллера в .net core 2.0 следующим образом:

[Route("api/[controller")]
public class UserController: Controller
{
    DBConnect c = null;
    KeyCheck chk = null;

    public UserController(IOptions<SystemSettings> settings)
    {
        c = new DBConnect(settings);
        chk = new KeyCheck();
    }

    public CoreResponse EditUser(string key, [FromBody]User input) {

        // duplicate part start
        CoreResponse response = new CoreResponse();
        response.status = "fail";
        response.errors = new List<string>();

        if (!chk.isValidKey(c, key)) {
            response.errors.Add("Invalid Key")
        }
        // duplicate part end

        // query exection logic here
        response.status = "success"
        // query execution end

        return response;
    }
}

Часть прокомментировала начало повторяющейся части и конец дублированной части повторяется в каждом отдельном месте. Я хотел бы удалить эту часть и стать чем-то вроде этого. Возможно ли это и как это можно сделать. Или какой-либо другой совет по рефакторингу этого кода?

[CheckKey]
public CoreResponse EditUser(string token, [FromBody]User input) {
    CoreResponse response = new CoreResponse();

    // query exection logic here
    response.status = "success"
    // query execution end

    return response;
}

1 Ответ

2 голосов
/ 07 октября 2019

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

CoreResponse response;
public UserController(IOptions<SystemSettings> settings)
{
    c = new DBConnect(settings);
    response = new CoreResponse();
    response.status = "fail";
    response.errors = new List<string>();
}

// Could also return bool if you want the caller to take a different
// action if the validation fails.
private void ValidateKey(string key)
{
    chk = new KeyCheck();
    if (!chk.isValidKey(c, key)) {
        // Response already initialized in constructor
        response.errors.Add("Invalid Key")
    }
}

public CoreResponse EditUser(string key, [FromBody]User input) {
    ValidateKey(key);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...