在 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;
}