c# - .Net Core 服务未注册
问题描述
我有以下两个带接口的类
public interface IInterface1
{
//declarations
}
public class class1 : IInterface1
{
//definitions
}
public interface IInterface2
{
//declarations
}
public class class2 : IInterface2
{
private readonly IInterface1 _interface;
//constructor
public class2(IInterface1 interface1)
{
//getting null for interface1
_interface = interface1;
}
}
和一个控制器,我在其中注入IInterface2
public class MyController : Controller
{
private readonly IInterface2 _usecase;
public MyController(IInterface2 usecase)
{
_usecase = usecase;
}
}
在 Startup.cs 我已经注册了这样的服务
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IInterface2, class2>();
services.AddScoped<IInterface1, class1>(x => (class1)x.GetService<IInterface1>());
}
面临的问题是当我在class2中注入IInterface1时无法访问构造函数中 interface1 的属性而不是获取 null
解决方案
如果您将配置替换为以下内容,则您在问题中显示的示例效果很好:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IInterface2, class2>();
services.AddScoped<IInterface1, class1>();
}
请注意,您写的那行:
services.AddScoped<IInterface1, class1>(x => (class1)x.GetService<IInterface1>())
正在导致Access Violation
(因为,当Interface1
需要时,依赖系统会尝试Interface1
从依赖系统中获取...一个,使用GetService
无限递归执行此规则)
我们需要更多详细信息来了解您的问题并帮助解决问题。
您可能需要为您的类创建一个工厂,或者解决您在评论中提到的循环依赖,这显然会阻止您使用此处显示的简单注入。
推荐阅读
- c# - 将已压缩的响应返回给客户端
- swift - CoreML:为什么预测是一个数组?
- android - 如何在 Xamarin 的键盘顶部添加自定义按钮
- java - 使用在切换菜单中创建的选项更改整个代码中的十进制格式
- installation - 在选择 C:\CustomFolder 安装路径时,安装路径应为子文件夹 C:\CustomFolder\Parent\Child
- python - 对已排序 csv 的高效查询
- linux - 如何创建一个linux终端ASCII字符标志?
- python - 如何实施 kolmogorov-smirnov 测试以提取适合我的数据的最佳分布?
- azure - 从 ARM 模板中的 Azure 密钥保管库获取最新版本的证书
- node.js - 将原始数据上传到 Google Cloud 功能中的 Firebase 存储桶?