首页 > 解决方案 > 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

标签: c#asp.net-coreasp.net-core-identity

解决方案


看起来你有一个过度依赖注入的案例。

旁白:您几乎肯定不想在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);
}

推荐阅读