将编译时字符串传递给 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) 的可用数据派生模式名称,例如它的名称,或者您放在它上面的自定义属性,或者静态 属性 或通过反射调用的方法。