实例化一个班级

时间:2017-09-07 03:29:23

标签: c# asp.net-core

以下是我的示例代码。我有这个类,其构造函数采用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...
    }
}

如何正确地实例化该类,使其不会为空?

3 个答案:

答案 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对象。这样,你永远不会遇到问题。