ASP.NET 核心中的单例允许多个实例

Singleton in ASP.NET Core allows multiple instances

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

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

Startup.cs

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

HomeController.cs

public class HomeController : Controller
{
    private IPerson _person;

    public HomeController( IPerson person)
    {
        _person = person;
    }

    public ViewResult Index()
    {
        return View( "Index", $"{_person.id}");
    }
}

Person.cs

public interface IPerson
{
    string id { get; }
}

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

我怀疑,原因很简单,但实在不明白我哪里做错了。

Person.id 是一个 属性 定义为 expression-bodied 属性 每次调用时 return 都是一个新的 Guid,所以即使它可能是同样的例子,调用 Person.id 每次都会给你一个新的值。

为了正确测试它,将 class 定义为:

public class Person : IPerson
{
  private string id;

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

  public string Id => this.id;
}

现在 id 字段将在 class 创建时初始化,并且 Id 属性 应该 return 每个请求的值相同。

我认为问题在于您如何在 Person class 上定义 Id 属性:

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

这意味着:每次代码请求 id - 它都会得到一个 新创建的 Guid - 所以 当然 你每次看你的人都会得到 new/different Guid!

您需要在 Person 构造函数中获取 id 一次 - 然后 return 即:

public class Person : IPerson
{
    private string _id;

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

    public string id => _id;
}

非常确定一旦你完成了这个,单例就会工作——你每次查看时都会得到相同的Person实例它。