Asp.net core ASP.NET核心中的Singleton允许多个实例

Asp.net core ASP.NET核心中的Singleton允许多个实例,asp.net-core,dependency-injection,singleton,Asp.net Core,Dependency Injection,Singleton,我已经实现了非常简单的代码来检查ASP.NET Core 2.1中依赖项注入的功能 不幸的是,我得到了我预期的其他结果。每次刷新站点时,我都会得到另一个相同的id Startup.cs public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddSingleton<IPerson, Person>(); } Person.cs publ

我已经实现了非常简单的代码来检查ASP.NET Core 2.1中依赖项注入的功能

不幸的是,我得到了我预期的其他结果。每次刷新站点时,我都会得到另一个相同的id

Startup.cs

public void ConfigureServices(IServiceCollection services)
{    
    services.AddMvc();
    services.AddSingleton<IPerson, Person>();
}
Person.cs

public interface IPerson
{
    string id { get; }
}

public class Person : IPerson
{
    public string id => Guid.NewGuid().ToString();
}

我想,原因很简单,但我真的不明白我做错了什么。

Person.id
是一个用as-expression-bodied属性定义的属性,每次调用它时都返回一个新的Guid,所以即使它可能是同一个实例,每次调用
Person.id
都会得到一个新值

要正确测试它,请将类定义为:

public class Person : IPerson
{
  private string id;

  public Person()
  {
    this.id = Guid.NewGuid().ToString();
  }

  public string Id => this.id;
}

现在,
id
字段将在类创建时初始化,
id
属性应该为每个请求返回相同的值。

我认为问题在于如何在
Person
类上定义
id
属性:

public class Person : IPerson
{
    public string id => Guid.NewGuid().ToString();
}
这意味着:每次代码要求
id
-它都会得到一个新创建的Guid-所以当然你每次看你的人都会得到新的/不同的Guid

您需要在
Person
构造函数中获取
id
一次,然后返回:

public class Person : IPerson
{
    private string _id;

    public void Person()
    {
        _id = Guid.NewGuid().ToString();
    }

    public string id => _id;
}

我敢肯定,一旦你做到了这一点,单例将起作用-你每次看到它都会得到相同的
Person
实例

谢谢,我太简单了。
public class Person : IPerson
{
    private string _id;

    public void Person()
    {
        _id = Guid.NewGuid().ToString();
    }

    public string id => _id;
}