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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在实现c#非泛型接口泛型属性时跳过传递类型?相关的知识,希望对你有一定的参考价值。

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

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

相反,您可以将这两个问题完全分开:使用标准IdentityDbContext及其IdentityUser作为

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

以上是关于如何在实现c#非泛型接口泛型属性时跳过传递类型?的主要内容,如果未能解决你的问题,请参考以下文章

为啥接口的泛型方法可以在 Java 中实现为非泛型?

暴露非泛型接口的非泛型版本的模式

C#,MVC3,如何将非泛型 DBSet 与运行时定义的类型一起使用?

泛型集合与非泛型集合的异同

LINQ学习系列-----3.1 查询非泛型集合

为啥 C# 无法从非泛型静态方法的签名推断泛型类型参数类型?