Я новичок в Onion Architecture и пытаюсь применить ее в проекте ASP.NET. В настоящее время я реализую ASP.NET Identity и хочу использовать его класс UserManager
для хранения пользователей.
Из того, что я понял из Onion Architecture, я должен создать интерфейс на уровне домена, который можно использовать для обертывания UserManager
.
public interface IUserManager
{
public Task CreateAsync(string username, string password);
}
А на уровне инфраструктуры я бы затем реализовал свой собственный UserManager
, который является оболочкой для ASP.NET Identity UserManager
.
using Microsoft.AspNetCore.Identity;
public class MyUserManager : IUserManager
{
private readonly UserManager<IdentityUser> _userManager;
public UserManager(UserManager<IdentityUser> userManager)
{
_userManager = userManager;
}
public async Task CreateAsync(string username, string password)
{
var user = new IdentityUser { UserName = username };
await _userManager.CreateAsync(user, password);
}
}
Проблема
Моя проблема в том, что я также хотел бы возвращать возможные ошибки из UserManager.CreateAsync(...)
вместо того, чтобы иметь тип возвращаемого значения void
. Выглядит примерно так:
public class IdentityResult
{
public bool Succeeded { get; set; }
public IEnumerable<string> Errors { get; set; } // Some Error type instead of a string would be better
}
Мне пришлось бы определить этот DTO на уровне домена, поскольку они должны быть частью интерфейса IUserManager
, но я не уверен, что это правильный подход. Из проектов с открытым исходным кодом, которые я обнаружил, я не вижу, чтобы ни один из них использовал DTO на уровне домена, и люди, похоже, говорят, что DTO обычно являются проблемой приложения, но я мог бы просто переборщить с этим. Может, я уже использую неправильный подход к тому, как я сейчас это делаю?