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
实例它。
我已经实现了非常简单的代码来检查 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
实例它。