【问题标题】:Unity Container - Lazy injectionUnity Container - 延迟注入
【发布时间】:2016-03-23 16:10:16
【问题描述】:

假设我有一个班级

class Foo : FooBase {

  public Foo(Settings settings, IDbRepository db)
    : base(settings) {
      this.db = db;
  }

  ...

}

基本上 FooBase 通过构造函数接收设置并从配置文件中加载一些配置。

然后我有实现 IDbRepository 的类 MySQLRepository

class MySQLRepository : IDbRepository {

  ...

  public MySQLRepository(IConfigurationRepository config) {
    conn = new MySQLConnection(config.GetConnectionString());
  }

  ...

}

在 Program.cs 我有:

Foo foo = container.Resolve<Foo>();

问题是 FooBase 的构造函数只有在所有其他依赖项都加载后才会被调用。但是在调用 FooBase 构造函数之前不会加载配置。

我的想法是创建 IDbRepository 和任何其他需要配置的接口的惰性实现。

这是个好主意吗? 如何使用 Unity 容器实现它?

【问题讨论】:

  • 问题是 FooBase 的构造函数只有在所有其他依赖都加载完成后才会被调用。但是在调用 FooBase 构造函数之前不会加载配置。 什么?你想说什么?这是为什么?这是您的 DI 容器中的注册问题吗? IConfigurationRepository 是 MySQLRepository 的依赖关系,它被解析为 IDbRepository,这是 Foo 的依赖关系 - 依赖关系图非常简单,这就是为什么我不明白你面临的问题.. .(顺便说一句:IDbRepository 未连接到FooBase.ctor)
  • config.GetConnectionString() 访问应用程序配置。但是,应用程序配置仅在 BaseFoo 构造函数中加载(我无权访问该类)。 Unity 在调用 BaseFoo 的构造函数之前解析 IDbRepository(并调用 MySQLRepository 的构造函数)。所以基本上,尝试从配置中加载连接字符串的 MySQLRepository 构造函数在从应用程序配置中获取连接字符串之前被调用(在 BaseFoo 构造函数中)。
  • 具有循环依赖的代码很难推理。对于稍后查看代码的人来说,以比尝试延迟加载更明智的方式消除循环依赖会更好。

标签: c# .net dependency-injection lazy-loading unity-container


【解决方案1】:

你在找Deferring the Resolution of Objects吗?

class Foo : FooBase {
  Lazy<IDbRepository> _db;
  public Foo(Settings settings, Lazy<IDbRepository> db)
    : base(settings) {
    _db = db;
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多