在 AccountController 中使用依赖注入的问题
Issues Using Dependency Injection with AccountController
我正在使用 MVC 5 EF、Identity、Unity 清理旧应用程序我在弄清楚如何为 AccountController 注册 DI 时遇到了问题。在里面
在下面的例子中我改变了
以下
中的空构造函数
public AccountController()
{ }
对此
public AccountController(IDateTimeService dateTimeService, ILeagueLogic leagueLogic)
{
_dateTimeService = dateTimeService;
_leagueLogic = leagueLogic;
}
所以在完整的控制器中我有以下
public class AccountController : Controller
{
private ApplicationUserManager _userManager;
private IDateTimeService _dateTimeService;
private ILeagueLogic _leagueLogic;
[InjectionConstructor] <-- Nailed it
public AccountController(IDateTimeService dateTimeService, ILeagueLogic leagueLogic)
{
_dateTimeService = dateTimeService;
_leagueLogic = leagueLogic;
}
public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
{
UserManager = userManager;
SignInManager = signInManager;
}
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
private ApplicationSignInManager _signInManager;
public ApplicationSignInManager SignInManager
{
get
{
return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
}
private set { _signInManager = value; }
}
//
// GET: /Account/Login
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
}
在 UnityConfig 文件中我有以下内容
public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<IDateTimeService, DateTimeService>();
container.RegisterType<ILeagueLogic, LeagueLogic>();
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>();
container.RegisterType<UserManager<ApplicationUser>>();
container.RegisterType<DbContext, ApplicationDbContext>();
container.RegisterType<ApplicationUserManager>();
// container.RegisterType<AccountController>(new InjectionConstructor()); <-- Removed this line
}
但我明白了
The type MyProgram.Controllers.AccountController does not have a constructor that takes the parameters ().
有点难过.,.我相信我需要以某种方式注册控制器,但不确定......具体如何
最后一行
container.RegisterType<AccountController>(new InjectionConstructor());
explicitly tells Unity 使用 new AccountController()
构造函数
创建一个 AccountController
实例
Based on the docs 类型注册应该是这样的:
container.RegisterType<AccountController>(
new InjectionConstructor(
container.Resolve< IDateTimeService>(),
container.Resolve< IDateTimeService >()));
UPD: 如果您的 AccountController
class 中只有一个构造函数,您可以尝试完全删除 container.RegisterType<AccountController>(new InjectionConstructor());
行。 Unity应该能够在没有提示的情况下构建实例。
UPD2:
如果你有多个构造函数,但Unity只使用一个构造实例(例如,第二个可能用于单元测试项目)你可以用[=17装饰新的ctor =]属性
[InjectionConstructor]
public AccountController(IDateTimeService dateTimeService, ILeagueLogic leagueLogic)
{
_dateTimeService = dateTimeService;
_leagueLogic = leagueLogic;
}
我正在使用 MVC 5 EF、Identity、Unity 清理旧应用程序我在弄清楚如何为 AccountController 注册 DI 时遇到了问题。在里面 在下面的例子中我改变了 以下
中的空构造函数 public AccountController()
{ }
对此
public AccountController(IDateTimeService dateTimeService, ILeagueLogic leagueLogic)
{
_dateTimeService = dateTimeService;
_leagueLogic = leagueLogic;
}
所以在完整的控制器中我有以下
public class AccountController : Controller
{
private ApplicationUserManager _userManager;
private IDateTimeService _dateTimeService;
private ILeagueLogic _leagueLogic;
[InjectionConstructor] <-- Nailed it
public AccountController(IDateTimeService dateTimeService, ILeagueLogic leagueLogic)
{
_dateTimeService = dateTimeService;
_leagueLogic = leagueLogic;
}
public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
{
UserManager = userManager;
SignInManager = signInManager;
}
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
private ApplicationSignInManager _signInManager;
public ApplicationSignInManager SignInManager
{
get
{
return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
}
private set { _signInManager = value; }
}
//
// GET: /Account/Login
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
}
在 UnityConfig 文件中我有以下内容
public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<IDateTimeService, DateTimeService>();
container.RegisterType<ILeagueLogic, LeagueLogic>();
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>();
container.RegisterType<UserManager<ApplicationUser>>();
container.RegisterType<DbContext, ApplicationDbContext>();
container.RegisterType<ApplicationUserManager>();
// container.RegisterType<AccountController>(new InjectionConstructor()); <-- Removed this line
}
但我明白了
The type MyProgram.Controllers.AccountController does not have a constructor that takes the parameters ().
有点难过.,.我相信我需要以某种方式注册控制器,但不确定......具体如何
最后一行
container.RegisterType<AccountController>(new InjectionConstructor());
explicitly tells Unity 使用 new AccountController()
构造函数
AccountController
实例
Based on the docs 类型注册应该是这样的:
container.RegisterType<AccountController>(
new InjectionConstructor(
container.Resolve< IDateTimeService>(),
container.Resolve< IDateTimeService >()));
UPD: 如果您的 AccountController
class 中只有一个构造函数,您可以尝试完全删除 container.RegisterType<AccountController>(new InjectionConstructor());
行。 Unity应该能够在没有提示的情况下构建实例。
UPD2:
如果你有多个构造函数,但Unity只使用一个构造实例(例如,第二个可能用于单元测试项目)你可以用[=17装饰新的ctor =]属性
[InjectionConstructor]
public AccountController(IDateTimeService dateTimeService, ILeagueLogic leagueLogic)
{
_dateTimeService = dateTimeService;
_leagueLogic = leagueLogic;
}