如何在实现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#非泛型接口泛型属性时跳过传递类型?的主要内容,如果未能解决你的问题,请参考以下文章