Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Singleton使所有类都可以使用数据_C#_Asp.net Mvc_Asp.net Core_Model View Controller - Fatal编程技术网

C# 使用Singleton使所有类都可以使用数据

C# 使用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

我有一个AuthenticationController,它检查数据库以查看凭据是否有效。验证之后,我创建一个类的实例(见下文)并存储表中的相关部分

AuthenticationController.cs

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。谢谢你的信息和教育