параметр передан из конструктора NRE ASP.NET - PullRequest
0 голосов
/ 13 марта 2019

Я использовал WebForms (устаревшие) + ASP.NET MVC + SimpleInjector

public abstract class CustomBaseController : Controller
{
    protected User user;
    protected IAppDbContext repo;
    public CustomBaseController(User user, IAppDbContext repo)
    {
        this.user = user;
        this.repo = repo;
    }
}
// my controller
[MyCustomAuthorize]
public class MyCustomController : CustomBaseController
{
    public MyCustomController(User user, IAppDbContext repo) : base(user, repo)
    {
    }

    [HttpPost]
    public ActionResult PostMethod()
    {
        user.Name = "NewUserName"; // throw NullReferenceException that user is null
        // some logic
        // some logger
    }
}
// user entity
public class User
{
    public Guid Id { get; protected set; }
    public string Email { get; protected set; }
    public string DisplayName { get; protected set; }

    public string FirstName { get; protected set; }
    public string LastName { get; protected set; }

    // and other properties
}

// Register DI
private static void InitializeContainer()
{
    var container = new Container();
    container.Register<IUserSessionManagement, UserSessionManagement >(Lifestyle.Scoped);
    container.Register<User>(() => container.GetInstance<UserSessionManagement>().UserSession, Lifestyle.Scoped);
    DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}

// Wrapper for User 
public class UserSessionManagement : IUserSessionManagement
{
    public User UserSession { get; }
    public UserSessionManagement(IAppDbContext repo)
    {
        UserSession = (HttpContext.Current.Session[SESSION_AUTHENTICATED_USER] as User) ?? new User(Guid.Empty, null, null);
    }
}
  • Авторизация на основе куки.
  • SimpleInjector разрешает все зависимости, и не может обнулять параметр . если параметр равен нулю, исключение будет выдано при работе с конструктором.

Я получаю исключение NullReferenceException (user равно нулю) по запросу /PostMethod. Я искал любое место, где ссылка может стереть. Ничего такого. Ссылка не может переписать. похоже, GC очистил все ссылки.

ПРИМЕЧАНИЕ. Я не могу воспроизвести это при отладке. Я знаю об этой проблеме из журналов.

ПРИМЕЧАНИЕ1: MyCustomController создано успешно (user не равно NULL). Отправьте запрос, чтобы бросить ожидание, что пользователь является нулем.

1 Ответ

0 голосов
/ 13 марта 2019

Посмотрите на этот ответ Здесь

Нам нужно увидеть ваш CustomBaseController, чтобы увидеть больше.

public MyCustomController() : base()
{
}

Вам может просто понадобиться конструктор без параметров.

...