【问题标题】:Handling dependency injection when seeding the database在为数据库做种时处理依赖注入
【发布时间】:2015-12-15 13:18:54
【问题描述】:

我需要使用默认用户为应用程序数据库播种。我在这个项目中没有使用 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 类。我不希望它随着时间而改变,但这仍然是一个依赖项。我应该解决它吗?我该如何解决?

【问题讨论】:

    标签: c# .net asp.net-mvc dependency-injection dapper


    【解决方案1】:

    我调用 ConfigurationManager 来获取连接字符串。我不知道这是不是一个坏方法。

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

    您似乎遵循这种做法,所以我会说您正在做的事情很好。

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

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

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

    【讨论】:

      【解决方案2】:

      您正在以静态方式访问 HashedPassword 和 ConfigurationManager,这意味着您需要将它们更改为非静态类才能依赖注入它们。这可以通过更改它们(如果它们不是您的类,这可能是不可能的)或将它们包装在实例类中来完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-22
        • 2013-01-30
        • 2014-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-15
        相关资源
        最近更新 更多