C# 使用Singleton使所有类都可以使用数据
我有一个AuthenticationController,它检查数据库以查看凭据是否有效。验证之后,我创建一个类的实例(见下文)并存储表中的相关部分 AuthenticationController.csC# 使用Singleton使所有类都可以使用数据,c#,asp.net-mvc,asp.net-core,model-view-controller,C#,Asp.net Mvc,Asp.net Core,Model View Controller,我有一个AuthenticationController,它检查数据库以查看凭据是否有效。验证之后,我创建一个类的实例(见下文)并存储表中的相关部分 AuthenticationController.cs public class AuthenticationController : Controller { private readonly IEmployeeDetails ED; [HttpPost] public ActionResult Login(Login loginIte
public class AuthenticationController : Controller
{
private readonly IEmployeeDetails ED;
[HttpPost]
public ActionResult Login(Login loginItem)
{
ED.Employee_Number = (string)employeeDataTable.Rows[0]["Employee_Number"].ToString(); // crash because ED is null ?
我想与所有视图的所有控制器共享此实例化对象
最好的方法是什么?(类看起来像这样,但有更多字段)
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IEmployeeDetails, EmployeeDetails>();
services.AddControllersWithViews();
}
public void配置服务(IServiceCollection服务)
{
services.AddSingleton();
services.AddControllersWithViews();
}
我做错了什么?您必须像这样将服务注入控制器构造函数:
public AuthenticationController(IEmployeeDetails ED){
this.ED = ED;
}
另外,尝试使用AddScope而不是AddSingleton,作用域对象在一个请求中是相同的,但在不同的请求中是不同的,每个对象和每个请求的Singleton对象都是相同的。您必须像这样将服务注入控制器构造函数:
public AuthenticationController(IEmployeeDetails ED){
this.ED = ED;
}
另外,尝试使用AddScoped而不是AddSingleton,作用域对象在一个请求中是相同的,但在不同的请求中是不同的,每个对象和每个请求的Singleton对象都是相同的。为什么不让每个控制器从一个基本控制器继承?恐怕您必须更具体一点。有许多因素会影响答案。例如,发生这种情况时是否已创建所有控制器?例如,我认为一种方法是将EmployeeDetail实例存储在基础视图中较高的位置。控制器可以在那里访问它,也可以在创建它们时将它传递给它们。您的
AuthenticationController
是如何实现的?它是管道中的中间件吗?如果是,您应该向给定的ClaimsPrincipal
中添加一个ClaimsIdentity
,作为索赔保存所有所需的值。然后,每个控制器都可以检查用户
属性是否持有所需的值,或者您的中间件可以立即返回401,并且没有控制器会看到该请求。使用内置函数将EmployeeDetails
类型注册为singleton,然后将其注入控制器。如何创建singleton。这是我第一次。我需要创建一个接口吗?为什么不让每个控制器从一个基本控制器继承呢?恐怕你需要更具体一点。有许多因素会影响答案。例如,发生这种情况时是否已创建所有控制器?例如,我认为一种方法是将EmployeeDetail实例存储在基础视图中较高的位置。控制器可以在那里访问它,也可以在创建它们时将它传递给它们。您的AuthenticationController
是如何实现的?它是管道中的中间件吗?如果是,您应该向给定的ClaimsPrincipal
中添加一个ClaimsIdentity
,作为索赔保存所有所需的值。然后,每个控制器都可以检查用户
属性是否持有所需的值,或者您的中间件可以立即返回401,并且没有控制器会看到该请求。使用内置函数将EmployeeDetails
类型注册为singleton,然后将其注入控制器。如何创建singleton。这是我第一次。我需要创建一个界面吗?如果有两个用户试图使用我的网站。使用单例方法,数据将从一个用户提供给另一个用户?这似乎不对。我认为每一次会议都会分享这些数据。因此,一个用户将无法看到另一个用户的数据。如果这是您想要的,请将其保持为单例。我希望每个用户都有自己的EmployeeDetail实例(用户之间不共享)。我将把它改为Scoped。感谢您提供的信息和教育,如果有两个用户试图使用我的网站。使用单例方法,数据将从一个用户提供给另一个用户?这似乎不对。我认为每一次会议都会分享这些数据。因此,一个用户将无法看到另一个用户的数据。如果这是您想要的,请将其保持为单例。我希望每个用户都有自己的EmployeeDetail实例(用户之间不共享)。我将把它改为Scoped。谢谢你的信息和教育