【发布时间】:2021-05-08 05:10:39
【问题描述】:
我有以下类/接口:
public class DataExpressionViewModelFactory : IDataExpressionViewModelFactory
{
private readonly IDataExpressionService DataExpressionService;
public DataExpressionViewModelFactory(IDataExpressionService dataExpressionService)
{
DataExpressionService = dataExpressionService;
}
public DataExpressionViewModel Create(DatabaseTableColumn column)
{
return new DataExpressionViewModel(DataExpressionService, column);
}
}
public class DataExpressionService : IDataExpressionService
{
private readonly IDataExpressionViewModelFactory DataExpressionViewModelFactory;
...
}
使用 IOC 容器 (Microsoft.Extensions.DependencyInjection),它们之间存在循环依赖关系。 IDataExpressionViewModelFactory 需要 IDataExpressionService,反之亦然。
IDataExpressionViewModelFactory 创建DataExpressionViewModels,传入IDataExpressionService。 DataExpressionViewModels 使用 IDataExpressionService 来验证数据表达式字符串(用户输入)并从中进一步创建 DataExpressionViewModels,因为表达式可以相互嵌套(递归模型)。
有没有办法解决循环依赖?
【问题讨论】:
-
要么使用 a) 如果你的 IoC 支持属性注入,b) 将你的接口包装在 Lazy 中以延迟服务解析,要么 c) 注入服务定位器并在需要时获取服务.在这两种情况下,解决方案都是将其中一个循环引用移出构造函数,并在实例化对象后将其解析,因此不再存在循环依赖。
-
最好知道您使用的是什么具体的 IoC 容器库。它对于为您的容器提供正确答案很有用。
-
@aepot 我正在使用
Microsoft.Extensions.DependencyInjection。 -
这听起来像是一个设计问题。要求我们解决循环冲突而不详细解释您为什么要这样创建它是很困难的。目前问题中的解释没有提供足够的细节,无法让我们提出替代方案。
-
@ChrisMack - 我还没有完全按照你的想法去做,但听起来很像你在混合视图模型和数据组件。这就是设计出错的地方。我当然会避免这样做。
标签: c# dependency-injection ioc-container circular-dependency