Все еще задаетесь вопросом, должен ли BaseController наследоваться от Controller или ControllerBase?

я создаю BaseController в своем веб-приложении Asp.Net Core 2.0, которое покрывает некоторые из общих зависимостей, они все еще необходимы в реальных контроллерах.

Например, стандартные контроллеры Account и Manage в веб-приложении MVC 6 по умолчанию.

public class AccountController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly SignInManager<ApplicationUser> _signInManager;
    private readonly IEmailSender _emailSender;
    private readonly ILogger _logger;

    public AccountController(
        UserManager<ApplicationUser> userManager,
        SignInManager<ApplicationUser> signInManager,
        IEmailSender emailSender,
        ILogger<AccountController> logger)
    {
        _userManager = userManager;
        _signInManager = signInManager;
        _emailSender = emailSender;
        _logger = logger;
    }
   //rest of code removed
}

public class ManageController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly SignInManager<ApplicationUser> _signInManager;
    private readonly IEmailSender _emailSender;
    private readonly ILogger _logger;
    private readonly UrlEncoder _urlEncoder;

    private const string AuthenicatorUriFormat = "otpauth://totp/{0}:{1}?secret={2}&issuer={0}&digits=6";

    public ManageController(
      UserManager<ApplicationUser> userManager,
      SignInManager<ApplicationUser> signInManager,
      IEmailSender emailSender,
      ILogger<ManageController> logger,
      UrlEncoder urlEncoder)
    {
        _userManager = userManager;
        _signInManager = signInManager;
        _emailSender = emailSender;
        _logger = logger;
        _urlEncoder = urlEncoder;
    }
    // rest of code removed
}

В пользовательском шаблоне веб-приложения я создаю рефакторинг контроллера учетных записей для трех различных контроллеров: RegisterController (который обрабатывает все, что касается регистрации пользователя), LoginController (который обрабатывает вход и выход из системы) и баланс в третью. Я разделил Manage Controller на две части: ManagePasswordController (все, что связано с паролями) и UserManageController (все остальное).

В требованиях к DI есть много общего, и я хочу поместить их в BaseController. Чтобы выглядеть примерно так?

public abstract class BaseController : Controller
{
    private readonly IConfiguration _config;
    private readonly IEmailSender _emailSender;
    private readonly ILogger _logger;
    private readonly SignInManager<ApplicationUser> _signInManager;
    private readonly UserManager<ApplicationUser> _userManager;

     protected BaseController(IConfiguration iconfiguration,
        UserManager<ApplicationUser> userManager,
        SignInManager<ApplicationUser> signInManager,
        IEmailSender emailSender,
        ILogger<ManageController> logger)
    {
        _config = iconfiguration;
        _userManager = userManager;
        _signInManager = signInManager;
        _emailSender = emailSender;
        _logger = logger;
    }
    //rest of code removed
}

Но похоже, что это ничего не дает? потому что, как мне кажется, мне все еще нужно вводить все. Я не могу быть прав (я новичок в DI, поэтому ясно, что понятия не имею), но BaseController должен позволять мне делать NO DI, что является обычным для BaseController и RegisterController. Я ошибаюсь? Как мне выполнить то, что я пытаюсь сделать?

public class RegisterController : BaseController
{
    private const string ConfirmedRegistration = "User created a new account with password.";

    private readonly UserManager<ApplicationUser> _userManager;
    private readonly SignInManager<ApplicationUser> _signInManager;
    private readonly IEmailSender _emailSender;
    private readonly ILogger _logger;
    private readonly IConfiguration _config;

     public RegisterController(
        IConfiguration config,
        UserManager<ApplicationUser> userManager,
        SignInManager<ApplicationUser> signInManager,
        IEmailSender emailSender,
        ILogger<AccountController> logger) : base(config, userManager, signInManager, emailSender, logger)

    {
        _userManager = userManager;
        _signInManager = signInManager;
        _emailSender = emailSender;
        _logger = logger;
        _config = config;
    }
    //rest of code removed
}

Обновить

Предложение сэра Руфо

public abstract class BaseController : Controller
{
    protected UserManager<ApplicationUser> UserManager { get; }
    protected SignInManager<ApplicationUser> SignInManager { get; }
    protected IConfiguration Config { get; }
    protected IEmailSender EmailSender { get; }
    protected ILogger AppLogger { get; }

    protected BaseController(IConfiguration iconfiguration,
        UserManager<ApplicationUser> userManager,
        SignInManager<ApplicationUser> signInManager,
        IEmailSender emailSender,
        ILogger<ManageController> logger)
    {
        AppLogger = logger;
        EmailSender = emailSender;
        Config = iconfiguration;
        SignInManager = signInManager;
        UserManager = userManager; 
    }
}

И наследующий контроллер

public class TestBaseController : BaseController
{

    public TestBaseController() : base()
    {

    }
}

Это не работает Решарпер говорит мне, что мне нужно добавить параметры к базовому вызову конструктора в конструкторе TestBaseController.

Также должен ли BaseController наследоваться от Controller или ControllerBase в .Net Core 2.0?

Ответы на вопрос(3)

Ваш ответ на вопрос