【发布时间】:2020-07-19 00:02:47
【问题描述】:
我是 Onion Architecture 的新手,正在尝试将其应用到 ASP.NET 项目中。我目前正在实现 ASP.NET Identity,并希望使用其 UserManager 类来存储用户。
根据我对 Onion Architecture 的理解,我应该在域层中创建一个接口,用于包装UserManager。
public interface IUserManager
{
public Task CreateAsync(string username, string password);
}
然后在基础架构层中,我将实现我自己的 UserManager,它包装了 ASP.NET 标识 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 通常是一个应用程序问题,但我可能只是想多了。也许我现在的做法已经采取了错误的方法?
【问题讨论】:
标签: asp.net-identity domain-driven-design onion-architecture