微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将编译时字符串传递给类

如何解决将编译时字符串传递给类

我需要在编译时将 const 字符串传递给一个类。我有一个 MigrationHistoryRepository 类。而且我需要为每个使用它的 DbContext 使用不同的模式名称。我希望像这种通用方法这样的东西会起作用,但它不起作用。有没有办法做到这一点?

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");
    }
}

!!!!!!编辑!!!!!!

编辑已移至单独的问题

DependencyInjection cannot find the assebly

解决方法

您不能将字符串传递给泛型,只能传递类型。但是这里有一个类型要传递。

public class MigrationHistoryRepository<T> : SqlServerHistoryRepository where T : DbContext

options.ReplaceService<IHistoryRepository,MigrationHistoryRepository<TextDbContext>>(); 

然后从 typeof(T) 中可用的数据中派生架构名称,例如其名称,或您放置在其上的自定义属性,或通过反射调用的静态属性或方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。