我正在使用'Clean Architecture'解决方案模板,但是我认为这很有希望,但是,在分离从ApplicationUser
派生的IdentityUser
类时遇到了一个问题它们都是基础架构层的组成部分,在定义引用ApplicationUser
的帐户实体时,我在核心层“域”上具有依赖关系,因此我从内部进行单向引用到外面,我无法在此处使用它,所以我传递了一个通用类型,但仍然无法在基础结构中实现ApplicationDbContext
,有什么想法吗?
Account.cs
using MacSys.Domain.Common;
using System;
using System.Collections.Generic;
using System.Text;
namespace MacSys.Domain.Entities
{
public class Account<T> : LocaleEntityBase
{
public Account()
{
ApplicationUsers = new List<T>();
}
public City City { get; set; }
public string PhoneNumber { get; set; }
public IList<T> ApplicationUsers { get; set; }
}
}
IApplicationDbContext.cs
using MacSys.Domain.Entities;
using Microsoft.EntityFrameworkCore;
using System.Threading;
using System.Threading.Tasks;
namespace App.Application.Common.Interfaces
{
public interface IApplicationDbContext
{
DbSet<Country> Countries { get; set; }
DbSet<City> Cities { get; set; }
DbSet<AccountType> AccountTypes { get; set; }
DbSet<Configuration> Configurations { get; set; }
DbSet<Account<??>> Accounts { get; set; }
Task<int> SaveChangesAsync(CancellationToken cancellationToken);
}
}
ApplicationDbContext.cs
using App.Application.Common.Interfaces;
using App.Domain.Entities;
using App.Infrastructure.Identity;
using Microsoft.EntityFrameworkCore;
using System.Reflection;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using App.Infrastructure.Identity.ApplicationGroups;
namespace App.Infrastructure.Persistence
{
public class ApplicationDbContext : IdentityDbContext<ApplicationUser,
ApplicationRole,
string>, IApplicationDbContext
{
private readonly ICurrentUserService _currentUserService;
private readonly IDateTime _dateTime;
public ApplicationDbContext(
DbContextOptions options,
ICurrentUserService currentUserService,
IDateTime dateTime) : base(options)
{
_currentUserService = currentUserService;
_dateTime = dateTime;
}
public DbSet<Country> Countries { get; set; }
public DbSet<City> Cities { get; set; }
public DbSet<AccountType> AccountTypes { get; set; }
public DbSet<Configuration> Configurations { get; set; }
public DbSet<Account<ApplicationUser>> Accounts { get; set; }
}
}
在ApplicationDbContext类实现中出现错误,因为如果没有在项目之间进行双重引用,就无法找到两个属性之间的关系。
答案 0 :(得分:0)
一种将您的域与框架分开的常见方法是根本不耦合它们。实际上,您不必将所有实体都放在同一个数据库上下文中,也不需要使您的帐户实体也继承自ApplicationUser
。
相反,您可以做的是将这两个问题完全分开:使用标准IdentityDbContext
及其IdentityUser
作为身份验证和授权的主要用户身份。但要为您的域维护一个单独的Account
实体。您甚至可以共享相同的用户ID以获得一对一映射。然后,如果将Account
和域模型的其余部分放入其自己的数据库上下文中,则域实体将与应用程序的auth框架层完全分开。