如何在实现C#非泛型接口泛型属性时跳过传递类型?

时间:2019-12-20 21:29:32

标签: c# entity-framework asp.net-core asp.net-identity

我正在使用'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类实现中出现错误,因为如果没有在项目之间进行双重引用,就无法找到两个属性之间的关系。

1 个答案:

答案 0 :(得分:0)

一种将您的域与框架分开的常见方法是根本不耦合它们。实际上,您不必将所有实体都放在同一个数据库上下文中,也不需要使您的帐户实体也继承自ApplicationUser

相反,您可以做的是将这两个问题完全分开:使用标准IdentityDbContext及其IdentityUser作为身份验证和授权的主要用户身份。但要为您的域维护一个单独的Account实体。您甚至可以共享相同的用户ID以获得一对一映射。然后,如果将Account和域模型的其余部分放入其自己的数据库上下文中,则域实体将与应用程序的auth框架层完全分开。