将编译时字符串传递给 class
Passing compile time string to a class
我需要在编译时将常量字符串传递给 class。我有一个 MigrationHistoryRepository class。而且我需要为使用它的每个 DbContext 使用不同的架构名称。我希望像这种通用的 aprroach 这样的东西会起作用,但它不起作用。有办法吗?
public abstract class TextDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
if(!string.IsNullOrWhiteSpace(ConnectionString))
{
options.UseSqlServer(ConnectionString);
options.ReplaceService<IHistoryRepository, MigrationHistoryRepository<"MyTestSchema">>(); // Chaning EF history naming convention
}
}
}
public class MigrationHistoryRepository<T> : SqlServerHistoryRepository where T : string
{
public MigrationHistoryRepository(HistoryRepositoryDependencies dependencies)
: base(dependencies)
{
}
protected override string TableName { get { return "migration_history"; } }
protected override string TableSchema => T;
protected override void ConfigureTable(EntityTypeBuilder<HistoryRow> history)
{
base.ConfigureTable(history);
history.HasKey(h => h.MigrationId).HasName($"{TableName}_pkey");
history.Property(h => h.MigrationId).HasColumnName("id");
history.Property(h => h.ProductVersion).HasColumnName("product_version");
}
}
!!!!!!编辑 !!!!!!
编辑已移至单独的问题
您不能将字符串传递给泛型,只能传递给类型。但是这里你有一个类型要传递。
public class MigrationHistoryRepository<T> : SqlServerHistoryRepository where T : DbContext
和
options.ReplaceService<IHistoryRepository, MigrationHistoryRepository<TextDbContext>>();
然后从 typeof(T)
的可用数据派生模式名称,例如它的名称,或者您放在它上面的自定义属性,或者静态 属性 或通过反射调用的方法。
我需要在编译时将常量字符串传递给 class。我有一个 MigrationHistoryRepository class。而且我需要为使用它的每个 DbContext 使用不同的架构名称。我希望像这种通用的 aprroach 这样的东西会起作用,但它不起作用。有办法吗?
public abstract class TextDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
if(!string.IsNullOrWhiteSpace(ConnectionString))
{
options.UseSqlServer(ConnectionString);
options.ReplaceService<IHistoryRepository, MigrationHistoryRepository<"MyTestSchema">>(); // Chaning EF history naming convention
}
}
}
public class MigrationHistoryRepository<T> : SqlServerHistoryRepository where T : string
{
public MigrationHistoryRepository(HistoryRepositoryDependencies dependencies)
: base(dependencies)
{
}
protected override string TableName { get { return "migration_history"; } }
protected override string TableSchema => T;
protected override void ConfigureTable(EntityTypeBuilder<HistoryRow> history)
{
base.ConfigureTable(history);
history.HasKey(h => h.MigrationId).HasName($"{TableName}_pkey");
history.Property(h => h.MigrationId).HasColumnName("id");
history.Property(h => h.ProductVersion).HasColumnName("product_version");
}
}
!!!!!!编辑 !!!!!!
编辑已移至单独的问题
您不能将字符串传递给泛型,只能传递给类型。但是这里你有一个类型要传递。
public class MigrationHistoryRepository<T> : SqlServerHistoryRepository where T : DbContext
和
options.ReplaceService<IHistoryRepository, MigrationHistoryRepository<TextDbContext>>();
然后从 typeof(T)
的可用数据派生模式名称,例如它的名称,或者您放在它上面的自定义属性,或者静态 属性 或通过反射调用的方法。