【发布时间】: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