以下是我的示例代码。我有这个类,其构造函数采用IConfigurationRoot
参数并使用它来设置私有字段:
public class MyClass
{
private IConfigurationRoot _configuration;
public class MyClass(IConfigurationRoot configuration)
{
// I believe this has been injected
_configuration = configuration;
}
}
现在我想实例化那个类:
public class AnotherClass
{
private IConfigurationRoot _configuration;
private MyClass myclass;
public SomeMethod()
{
// My _configuration here gets null in the debugger
MyClass myclass = new MyClass(_configuration);
// Rest of method omitted...
}
}
如何正确地实例化该类,使其不会为空?
答案 0 :(得分:0)
你做了几件事。
1 - 您正在将{class 1}}中的类变量myclass
重新声明为局部变量。您应该使用已经声明为类变量的SomeMethod
变量。为此,请创建此行
myclass
喜欢这个
MyClass myclass = new MyClass(_configuration);
2 - 你没有实例化你的myclass = new MyClass(_configuration);
,所以在注入它之前它是null。您应该可以根据需要实例化它(IConfigurationRoot
像@Sach建议的那样,或者ConfigurationBuilder
就像@Eldho建议的那样),但是如果你不希望它被注入,你需要在它注入它之前实例化它空。
答案 1 :(得分:0)
请遵循以下流程:
1。)我所做的是将AppSettings.json文件的一部分映射到一个对象。
A。)将配置设置添加到json
文件。
"MyConfiguration": {
"DBServer": "MyDBServer",
"DBName": "MyDatabase"
}
B。)创建一个类以使用强类型配置。
public class MyConfiguration
{
public string DBServer { get; set;}
public string DBName { get; set;}
}
C。)将JSON配置映射到MyConfiguration
类中的Startup
对象。
public class Startup
{
//Make sure you add this.
public IConfigurationRoot Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
...
var configSection = Configuration.GetSection("MyConfiguration");
services.Configure<MyConfiguration>(configSection);
//Use one of the following.
Services.AddScoped<MyClass>();
Services.AddTransient<MyClass>();
Services.AddSingleton<MyClass>();
Services.AddInstance<MyClass>();
...
}
}
有关
之间差异的解释,请参阅此link`AddSingleton()`
`AddScopped()`
`AddInstance()`
`AddTransient()`
2.。)将MyClass
更改为MyConfiguration
对象作为MyClass
构造函数的参数。
//add this using statement and corresponding package
//"Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.1"
using Microsoft.Extensions.Options;
public class MyClass
{
private MyConfiguration _configuration;
public MyClass(IOptions<MyConfiguration> configuration)
{
_configuraiton = configuraiton.Value;
}
}
3.)添加MyClass
作为AnotherClass
构造函数的参数。依赖注入将创建MyClass
或重复使用它,具体取决于对象的范围以及如何在Startup.ConfifureServices()
方法中设置它。
public class AnotherClass
{
private MyClass _myclass;
public AnoherClass(MyClass myclass)
{
_myclass= myclass;
}
public SomeMethod()
{
//Use myClass here and you don't need to instantiate it.
_myclass
....
}
}
答案 2 :(得分:0)
在这里,最好使用像Autofac或Unity这样的IOC容器或ASP.NET核心中的内置容器(如果你使用的是核心)。您需要使用IOC容器注册IConfigurationRoot接口及其实现的类。在此之后,使用IOC容器(在构造函数中,或在方法中,根据您的最佳方案)注入MyClass对象。这样,你永远不会遇到问题。