System.InvalidOperationException: 当前类型,Microsoft.Extensions.Configuration.IConfiguration,是一个接口,无法构造
System.InvalidOperationException: The current type, Microsoft.Extensions.Configuration.IConfiguration, is an interface and cannot be constructed
System.InvalidOperationException: The current type, Microsoft.Extensions.Configuration.IConfiguration, is an interface and cannot be constructed. Are you missing a type mapping?
我在 .NET Core 中使用 unity,在这一行出现了上面的错误:
container.RegisterInstance<IServiceA>(IoC.Resolve<IServiceB>());
IServiceB 注册为:
container.RegisterType<IServiceB, ServiceA>(new ContainerControlledLifetimeManager());
我有一个 class ServiceA 实现了如下 IService B。
public class ServiceA : IServiceB
{
private IConfiguration _configuration;
public ServiceA(IConfiguration configuration): base(configReader)
{
_configuration = configuration;
}
public string someVariable => _configuration.GetSection("Section").GetSection("WantedKey").Value;
...
}
我正在使用 Microsoft.Extensions.Configuration.IConfiguration 进行配置。
所以我不知道如何映射它,因为我是从 Microsoft.Extensions.Configuration.IConfiguration 获取的。
我做错了什么?我该如何解决?
假设文件像 config.json
{
"Section" : {
"WantedKey" : "WantedValue"
}
}
您首先需要构建一个配置实例
IConfiguration config = new ConfigurationBuilder()
.AddEnvironmentVariables()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("config.json", optional: true, reloadOnChange: true);
.Build();
并在容器中注册
container.RegisterInstance<IConfiguration>(config);
为了 IConfiguration
可以被解析。
现在理想情况下你真的不应该为了注射而传递 IConfiguration
。通常在组合根目录下访问它以获取其他依赖项的设置。尽量避免耦合到外部框架依赖。
在这种情况下,您可能希望创建一个强类型来保存所需的设置
public class MySetting {
public string WantedKey { get; set; }
}
并从配置中填充它的一个实例
MySetting setting = config.GetSection("Section").Get<MySetting>();
你会用容器注册它
container.RegisterInstance<MySetting>(setting);
并将其注入家属
public class ServiceA : IServiceB {
private readonly MySetting setting;
public ServiceA(MySetting setting) {
this.setting = setting;
}
public string someVariable => setting.WantedKey;
//...
}
System.InvalidOperationException: The current type, Microsoft.Extensions.Configuration.IConfiguration, is an interface and cannot be constructed. Are you missing a type mapping?
我在 .NET Core 中使用 unity,在这一行出现了上面的错误:
container.RegisterInstance<IServiceA>(IoC.Resolve<IServiceB>());
IServiceB 注册为:
container.RegisterType<IServiceB, ServiceA>(new ContainerControlledLifetimeManager());
我有一个 class ServiceA 实现了如下 IService B。
public class ServiceA : IServiceB
{
private IConfiguration _configuration;
public ServiceA(IConfiguration configuration): base(configReader)
{
_configuration = configuration;
}
public string someVariable => _configuration.GetSection("Section").GetSection("WantedKey").Value;
...
}
我正在使用 Microsoft.Extensions.Configuration.IConfiguration 进行配置。
所以我不知道如何映射它,因为我是从 Microsoft.Extensions.Configuration.IConfiguration 获取的。
我做错了什么?我该如何解决?
假设文件像 config.json
{
"Section" : {
"WantedKey" : "WantedValue"
}
}
您首先需要构建一个配置实例
IConfiguration config = new ConfigurationBuilder()
.AddEnvironmentVariables()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("config.json", optional: true, reloadOnChange: true);
.Build();
并在容器中注册
container.RegisterInstance<IConfiguration>(config);
为了 IConfiguration
可以被解析。
现在理想情况下你真的不应该为了注射而传递 IConfiguration
。通常在组合根目录下访问它以获取其他依赖项的设置。尽量避免耦合到外部框架依赖。
在这种情况下,您可能希望创建一个强类型来保存所需的设置
public class MySetting {
public string WantedKey { get; set; }
}
并从配置中填充它的一个实例
MySetting setting = config.GetSection("Section").Get<MySetting>();
你会用容器注册它
container.RegisterInstance<MySetting>(setting);
并将其注入家属
public class ServiceA : IServiceB {
private readonly MySetting setting;
public ServiceA(MySetting setting) {
this.setting = setting;
}
public string someVariable => setting.WantedKey;
//...
}