获取继承接口<Type:Type>的类
Getting classes that Inherits interface<Type:Type>
这是我的问题,我想将所有流畅的 api 配置 类 作为列表获取。
然后将它们应用到我的 DbContext 中。
我的域 类 都像这样继承 BaseModel ;
public class Role : BaseModel
{
public string RoleTitle { get; set; }
public string RoleDescription { get; set; }
public ICollection<UserRole> UserRoles { get; set; }
}
配置如下:
public class RoleConfig : IEntityTypeConfiguration<Role>
{
public void Configure(EntityTypeBuilder<Role> builder)
{
builder.Property(r => r.RoleTitle)
.IsRequired()
.HasMaxLength(100);
builder.Property(r => r.RoleDescription)
.HasMaxLength(250);
}
}
我已经在我的 DbContext 中使用的是:
modelBuilder.ApplyConfiguration(new UserConfig());
modelBuilder.ApplyConfiguration(new RoleConfig());
modelBuilder.ApplyConfiguration(new UserRoleConfig());
and more .....
而我正在寻找的是:
foreach (var config in ConfigClasses)
{
modelBuilder.ApplyConfiguration(config);
}
所以问题是我如何获得所有配置 类?我试过了但没有用:
var type = typeof(IEntityTypeConfiguration<Anytype : BaseModel>);
var ConfigClasses= AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p)).ToList();
问题是 IEntityTypeConfiguration<Anytype : BaseModel>
任何 idia 我该怎么做?以这种方式或任何其他方式?
ModelBuilder
上有一个添加所有配置的方法,你可以使用它:
modelBuilder.ApplyConfigurationsFromAssembly(typeof(YourDbContext).Assembly);
如您所知,YourDbContext
和配置必须在同一个程序集中。
下面是一个关于如何通过反射查找通用接口的例子:
var appDomain = AppDomain.CurrentDomain;
var assemblies = appDomain.GetAssemblies();
foreach (var assembly in assemblies)
{
var types = assembly.GetTypes();
foreach (var type in types)
{
var interfaces = type.GetInterfaces();
foreach (var iface in interfaces)
{
if (iface.IsGenericType)
{
var genericInterface = iface.GetGenericTypeDefinition();
if(genericInterface == typeof(MyGenericInterface<>))
{
Console.WriteLine($"Type {type.Name} implements {genericInterface.Name}");
}
}
}
}
}
有了这个草图,您应该能够找到所有需要的类型,通过 Activator.CreateInstance()
初始化它们并将这些实例应用到您的模型构建器。
这是我的问题,我想将所有流畅的 api 配置 类 作为列表获取。 然后将它们应用到我的 DbContext 中。 我的域 类 都像这样继承 BaseModel ;
public class Role : BaseModel
{
public string RoleTitle { get; set; }
public string RoleDescription { get; set; }
public ICollection<UserRole> UserRoles { get; set; }
}
配置如下:
public class RoleConfig : IEntityTypeConfiguration<Role>
{
public void Configure(EntityTypeBuilder<Role> builder)
{
builder.Property(r => r.RoleTitle)
.IsRequired()
.HasMaxLength(100);
builder.Property(r => r.RoleDescription)
.HasMaxLength(250);
}
}
我已经在我的 DbContext 中使用的是:
modelBuilder.ApplyConfiguration(new UserConfig());
modelBuilder.ApplyConfiguration(new RoleConfig());
modelBuilder.ApplyConfiguration(new UserRoleConfig());
and more .....
而我正在寻找的是:
foreach (var config in ConfigClasses)
{
modelBuilder.ApplyConfiguration(config);
}
所以问题是我如何获得所有配置 类?我试过了但没有用:
var type = typeof(IEntityTypeConfiguration<Anytype : BaseModel>);
var ConfigClasses= AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p)).ToList();
问题是 IEntityTypeConfiguration<Anytype : BaseModel>
任何 idia 我该怎么做?以这种方式或任何其他方式?
ModelBuilder
上有一个添加所有配置的方法,你可以使用它:
modelBuilder.ApplyConfigurationsFromAssembly(typeof(YourDbContext).Assembly);
如您所知,YourDbContext
和配置必须在同一个程序集中。
下面是一个关于如何通过反射查找通用接口的例子:
var appDomain = AppDomain.CurrentDomain;
var assemblies = appDomain.GetAssemblies();
foreach (var assembly in assemblies)
{
var types = assembly.GetTypes();
foreach (var type in types)
{
var interfaces = type.GetInterfaces();
foreach (var iface in interfaces)
{
if (iface.IsGenericType)
{
var genericInterface = iface.GetGenericTypeDefinition();
if(genericInterface == typeof(MyGenericInterface<>))
{
Console.WriteLine($"Type {type.Name} implements {genericInterface.Name}");
}
}
}
}
}
有了这个草图,您应该能够找到所有需要的类型,通过 Activator.CreateInstance()
初始化它们并将这些实例应用到您的模型构建器。