Все еще задаетесь вопросом, должен ли 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?