Лучшая практика для возврата информации между слоями в> чистом интернет -API [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 Лучшая практика для возврата информации между слоями в> чистом интернет -API [закрыто]

Сообщение Anonymous »

Я проектирую веб -API в .net 8. У меня всегда есть эта внутренняя дискуссия о том, как передавать информацию между уровнями и, наконец, пользователю. < /p>
У моего API есть три простых слои. Контроллер, служба, репозиторий. Когда репозиторий переходит в базу данных, был ли у меня успешный или неудачный вызов, как мне передать это в службу, службу контроллеру и, наконец, пользователю?
// Api
../controller
../service
../ Repository
example.
В этом сценарии я не возвращаю никаких отзывов в мою службу или контроллер, я позволю коду. < /p>
public virtual async Task Add(User user)
{
try{
await context.Add(user);
await context.SaveChangesAsync();
}
catch(Exception ex){
//.. logging error here
}
}
< /code>
Если я сделаю Get, My Repo вернет пользователя из базы данных, в данном случае я могу доставить пользовательские данные к контроллеру через службу. Если пользовательские данные являются нулевыми, я верю соответствующий не найден HTTP -код, если пользовательские данные не являются нулевыми, я вернусь http -код < /p>
public virtual async Task Get(int userId)
{
try{
return await _context.FindAsync(id);;
}
catch(Exception ex){
//.. logging error here
}
}
< /code>
Скажем то же самое с обновлением и удалите. Мой вопрос: это хорошая практика, чтобы иметь объект, чтобы сохранить результаты успехов/неудачи?
Например, что -то вроде этого для всего творога.public class OperationResult where T : class
{
public bool Success { get; internal set; }
public IEnumerable Errors { get; internal set; } = [];
public T? Data { get; internal set; } = default;

public static OperationResult Successful(T? data = null) => new OperationResult
{
Success = true,
Data = data
};

public static OperationResult Failure(IEnumerable errors) => new OperationResult
{
Success = false,
Errors = errors,
};
}
< /code>
С помощью этого объекта я могу установить данные, передавать их через слои, проверить, хорошо ли процесс или нет. Наконец, возвращая правильный ответ пользователю. Сказать, что я могу сделать что -то подобное. < /P>
public virtual async Task Get(int id)
{
try
{
var user = await _context.FindAsync(id);

if (user != null)
return OperationResult.Successful(user);

return OperationResult.Failure( new List { "User not found" });

}
catch (Exception ex) {
//Todo -> log here
}

return OperationResult.Failure( new List { "Error getting the user" });
}
< /code>
и < /p>
public virtual async Task Add(User user)
{
try {
await _contxet.AddAsync(user);
await _context.SaveChangesAsync();

return OperationResult.Successful();
}
catch (Exception ex) {
//Todo -> log here
}

return OperationResult.Failure(new List { "Creating error" });
}
< /code>
Я заметил, что в случае добавления мне не нужно возвращать объект, который я только что вставил. Я понятия не имею, если это хорошо или плохо. Я склонен к плохому. < /P>
Итак, хорошая идея иметь объект такого рода или нет? Или, может быть, есть другие решения, о которых я не знаю. Кроме того, это решение похоже на антипаттерн.
Не могли бы вы помочь мне выяснить, какое лучше>

Подробнее здесь: https://stackoverflow.com/questions/794 ... re-web-api
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»