c# - 使用构造函数注入的 StructureMap 递归
问题描述
我需要弄清楚如何将接口的实现注入到自身中。如下例所示,我想add
递归地使用该方法。
带有添加功能的简单界面
public interface IRecursiveFactory
{
int Add(int number, int max = 10);
}
注入DI容器
container.For<IRecursiveFactory>().Use<RecursiveFactory>();
这将是显而易见的实现,但它不是递归的
public class RecursiveFactory : IRecursiveFactory
{
public int Add(int number, int max = 10)
{
while (number < max)
{
number++;
Console.WriteLine(number);
}
return number;
}
}
这是一个不起作用的递归示例,它返回错误Activation error occurred while trying to get an instance of type IRecursiveFactory
public class RecursiveFactory : IRecursiveFactory
{
private readonly IRecursiveFactory _recursiveFactory;
// Inject "self"
public RecursiveFactory(IRecursiveFactory recursiveFactory)
{
_recursiveFactory = recursiveFactory;
}
public int Add(int number, int max = 10)
{
while (number < max)
{
// recurse
var newNumber = number + 1;
Console.WriteLine(newNumber);
number = _recursiveFactory.Add(newNumber);
}
return number;
}
}
解决方案
事实证明 Lazy Resolution 解决了这个问题,其他解决方案仍然很有趣,因为这显然是一个激活问题。
懒惰的工作版本
public class RecursiveFactory : IRecursiveFactory
{
private readonly Lazy<IRecursiveFactory> _recursiveFactory;
public RecursiveFactory(Lazy<IRecursiveFactory> recursiveFactory)
{
_recursiveFactory = recursiveFactory;
}
public int Add(int number, int max = 10)
{
while (number < max)
{
var newNumber = number + 1;
Console.WriteLine(newNumber);
number = _recursiveFactory.Value.Add(newNumber);
}
return number;
}
}
推荐阅读
- azure - Azure Blob 存储:虚拟文件夹结构与 Blob 索引标签
- excel - 在 PowerQuery 中将列表转换为具有布尔值的列
- html - 相同的 CSS 动画不会在两个事件上运行 [仅限 HTML/CSS]
- python - 防止在python中对大浮点数进行舍入
- linux - “插入模块”到 Docker?
- node.js - 如何使用 Nodejs 从 GPS 跟踪器 st-901 获取数据?
- python - Django nginx gunicorn 它们如何连接在一起?
- html - 如何在引导程序中将徽标图像、电话、位置放在导航栏上方?
- python - 使用python自动检查链接是否处于活动状态
- settings - 如何在 DNN 中使“在菜单中显示”默认设置关闭