c# - Asp.Net Core 类不传递数据
问题描述
在 asp.net core 2.1 Identity 中,我使用一个类从 ExternalLogin.cshtml.cs 和 Login.cshtml 移动登录名,以通过类 AddUserToStudentTable 将它们保存到另一个表中。
编辑 - 我弄错了 DTO 的术语,但认为它只是一个推动数据的类。我只是使用了错误的命名约定。
班级是
public class StudentNameDTO : IStudentNameDTO
{
public string StudentGoogleNameLogin { get; set; } = string.Empty;
public bool IsExternal { get; set; } = false;
}
Startup 正在使用 AddSingleton,但我也尝试过 AddTransient,没有区别。
services.AddSingleton<IStudentNameDTO, StudentNameDTO>();
而且我正在使用通过精彩的 VS 2017 自动完成的常用构造函数注入
然而,当传递数据时,我总是得到一个错误
评估方法 () 调用本地方法系统 System.Environment.FailFast()。
这一切都崩溃了
NullReferenceException:对象引用未设置为对象的实例。ASPNZBat.Business.AddUserToStudentTable.AddUserToStudent(string Email) 在 AddUserToStudentTable.cs + if (_studentNameDTO.IsExternal == true) ASPNZBat.Areas.Identity.Pages.Account.ExternalLoginModel.OnGetCallbackAsync(string returnUrl, string remoteError) 在 ExternalLogin.cshtml。 cs + _addUserToStudentTable.AddUserToStudent(Email);
我在启动时也尝试过使用 AddTransient 和 AddScope ,但没有区别。经过几个小时的工作,我开始怀疑我的编程能力......
请注意,当有数据通过时,它可以正常工作。但是当没有数据 - null - 而不是使用它时,它只会崩溃。我什至将它包装在一个布尔值中,看看我是否可以用它来捕捉输出,但它也崩溃了布尔值。
进入的数据
if (info.Principal.Identity.Name != null)
{
_studentNameDTO.IsExternal = true;
_studentNameDTO.StudentGoogleNameLogin = info.Principal.Identity.Name;
string Email = info.Principal.FindFirstValue(ClaimTypes.Email);
_addUserToStudentTable.AddUserToStudent(Email);
}
数据出来了
string StudentName = string.Empty;
if (_studentNameDTO.IsExternal == true)
{
StudentName = _studentNameDTO.StudentGoogleNameLogin;
}
有一些关于传递它不喜欢的空数据的东西,我不明白。
这是它的 github acc https://github.com/Netchicken/ASPNZBatV2/tree/master/ASPNZBat
解决方案
看起来你有一个过度依赖注入的案例。
旁白:您几乎肯定不想在
AddSingleton
这里使用,单例是您希望您的应用程序在其执行期间不超过一个实例的东西。在这种情况下,这意味着如果您有两个用户同时登录(或此处的任何进程),他们将共享相同的StudentNameDTO
.
根据AddUserToStudentTable.cs中的代码,您看到 a 的原因NullReferenceException
是这里没有任何东西在_studentNameDTO
使用之前分配给它。它没有被注入任何地方,也没有被传递到任何地方的类中,它被声明private
为不能从类外部访问,只能从第 36 行和第 38 行读取。
也就是说,并非代码中的所有内容都需要或应该通过依赖注入来实例化。你StudentNameDTO
不是类所依赖的东西,而是它消耗/修改的东西。粗略看一下您的代码,看起来获取存储到其中的所有数据的位置StudentNameDTO
就在其中,ExternalLoginModel.OnGetCallbackAsync
因此这是您var studentNameDto = new StudentNameDTO()
在调用实例AddUserToStudent
并将其传递给方法之前应该在的位置,例如(第 97 行开始):StudentNameDTO
if (info.Principal.Identity.Name != null)
{
var studentNameDto = new StudentNameDTO
{
IsExternal = true,
_studentNameDTO.StudentGoogleNameLogin = info.Principal.Identity.Name
};
string Email = info.Principal.FindFirstValue(ClaimTypes.Email);
_addUserToStudentTable.AddUserToStudent(studentNameDto, Email);
}
推荐阅读
- docker - 带有 Docker、Fastlane 和 Cocoapods 的 GitLab CI 无法正常工作
- c# - 无法使用 nuget 包加载 Microsoft.WITDataStore32.dll:Microsoft.TeamFoundationServer.ExtendedClient
- php - 无法更新我的 php 和 mysql 数据库数据
- python - Keras 深度学习和财务回报
- r - 如何将 foreach %dopar% 日志写入单独的文件
- python - 将 urllib.request 与代理一起使用
- amazon-athena - 在多种产品中获得唯一客户数量的最佳方式
- php - 使用 php5.6 安装 debian 拉伸
- c# - 身份验证过滤器不适用于 Web API 中的授权过滤器
- android - 如何使用 volley 将多个图像存储在 Array 和单个 ImageView 上