gpt4 book ai didi

c# - 为数据库做种时处理依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-03 03:02:13 25 4
gpt4 key购买 nike

我需要使用默认用户为应用程序数据库提供种子。我在这个项目中没有使用Entity Framework,我决定使用Dapper

我能做的最简单的事情就是拥有一个简单的类,例如带有 Seed() 静态方法的 DatabaseConfig (或 AccountsConfig):

public class DatabaseConfig {

public static void Seed() {

using(var conn = new SqlConnection()) {

conn.ConnectionString = GetConnectionString();
conn.Open();

var query = "insert into users (username, [password]) values (@username, @password)";

var queryParams = new {
username = "Admin",
password = HashedPassword.CreateHash("DefaultSecretKey")
}

conn.Execute(query, queryParams);
}

}

private static string GetConnectionString() {
return ConfigurationManager.ConnectionStrings["appDb"].ConnectionString;
}
}

然后在Global.asax中调用它:

DatabaseConfig.Seed();

我这里有两个依赖项:

  1. 我调用 ConfigurationManager 来获取连接字符串。我不知道这是否是一个糟糕的方法。对于我在应用程序中使用的其他服务,我将连接字符串作为构造函数参数传递到 SimpleInjector 初始化程序中:

    private static void InitializeContainer(Container container) {

    var appDbConnString = ConfigurationManager.ConnectionStrings["appDb"].ConnectionString;
    container.RegisterSingleton<IUsersRepository>(new UsersRepository(appDbConnString));

    }
  2. 另一个依赖项是 HashedPassword 类。我不希望它随着时间而改变,但这仍然是一种依赖。我应该解决它吗?如何解决?

最佳答案

I call a ConfigurationManager to get a connection string. I don't know if this is a bad approach.

一般来说,您应该只在应用程序启动时读取配置文件,并且最好只在应用程序的启动路径中读取配置文件。这允许将配置文件的读取集中在一个位置,并且允许应用程序在某些配置值丢失的情况下快速失败。

你似乎遵循了这种做法,所以我想说你所做的很好。

The other dependency is HashedPassword class. I don't expect it to change with time but still this is a dependency. Should I resolve it?

由于这个 Seed 方法似乎是您的组合根的一部分,因此可以对系统中的其他类有很强的依赖性。或者让我换句话说,如果使用此依赖项不会以任何方式造成麻烦(因为您不想单独测试代码,或者想要替换、包装、装饰或拦截该类内的代码) ),我想说这没问题。

但是,如果您希望此 HashesPassword 类可注入(inject),则必须将其设为实例类。在这种情况下,您可能应该将其隐藏在抽象后面(例如 IHashPashword),并将其作为参数传递到 Seed() 方法中,或者您应该提升 DatabaseConfig 到具有非静态方法的非静态类,并将 IHashPashword 抽象注入(inject)其构造函数。这允许您从容器解析DatabaseConfig

关于c# - 为数据库做种时处理依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34290333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com