У меня есть по умолчанию constuctor и конструктор с Params, как здесь:Как придать WebAPI AccountController в WebAPI
public class AccountController : ApiController
{
private const string LocalLoginProvider = "Local";
private ApplicationUserManager _userManager;
public ISecureDataFormat<AuthenticationTicket> AccessTokenFormat { get; private set; }
[Dependency]
public IRepository Repository{ get; private set; }
public AccountController()
{
}
public AccountController(ApplicationUserManager userManager, ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
{
_userManager = userManager;
AccessTokenFormat = accessTokenFormat;
}
}
И мое единство конфигурации здесь:
.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager())
.RegisterType<UserManager<ApplicationUser, int>, ApplicationUserManager>()
.RegisterType<ApplicationDbContext>(new HierarchicalLifetimeManager())
.RegisterType<ApplicationUserManager>()
.RegisterType<ISecureDataFormat<AuthenticationTicket>, SecureDataFormat<AuthenticationTicket>>()
.RegisterType<ITextEncoder, Base64UrlTextEncoder>()
.RegisterType<IDataSerializer<AuthenticationTicket>, TicketSerializer>()
//.RegisterType<IDataProtector>(() => new DpapiDataProtectionProvider().Create("ASP.NET Identity"))
.RegisterType<IUserStore<ApplicationUser, int>, CustomUserStore>(new InjectionConstructor(typeof(ApplicationDbContext)))
.RegisterType<IAuthenticationManager>(new InjectionFactory(o => HttpContext.Current.GetOwinContext().Authentication))
.RegisterType<IOwinContext>(new InjectionFactory(o => HttpContext.Current.GetOwinContext()))
.RegisterType<IRepository, Repository>();
Но дело в том, что конструктор по умолчанию всегда вызывается. я прочитал статью TAHT blog, но они не говорили, как разрешить такой случай с конструктором havaving Params AccountController(ApplicationUserManager userManager, ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
Если я взлетаю конструктор без параметров я получаю сообщение об ошибке: "An error occurred when trying to create a controller of type 'AccountController'. Make sure that the controller has a parameterless public constructor.",
Есть ли кто-нибудь может помочь?
Также у меня есть только нормальный ApiController и я не получает инъекции, а также:
public class MyController : ApiController
{
[Dependency]
public IRepository Repository { get; set; }
public IHttpActionResult Get()
{
var test = Repository.GetSomething(); // Repository is null here always
}
}
UPDATE 1 на основе @IgorPashchuk suggeston Теперь MyController
становится впрыскивается прямо сейчас. Но AccoutController нет. Я удаляю конструктор по умолчанию, но все еще получаю ошибку.
UPDATE 2 переделываю конструктор с Params, вынимая второй из параметров:
public class AccountController : ApiController
{
private const string LocalLoginProvider = "Local";
private ApplicationUserManager _userManager;
[Dependency]
public IRepository Repository{ get; private set; }
public AccountController(ApplicationUserManager userManager)
{
_userManager = userManager;
}
}
Так что этот способ я получил вещь работает. Я понимаю, что это означает, что Unity не смог построить тип ISecureDataFormat<AuthenticationTicket>
. Я оставляю еще один вопрос по этому вопросу How to construct ISecureDataFormat<AuthenticationTicket> with unity
'ApplicationUserManager' есть:' .RegisterType() ' –
sreginogemoh
Нужно ли мне пакет Unity.Mvc? Это швы, как будто мне это больше не нужно? – sreginogemoh
@sreginogemoh, вы правы. Прости, я пропустил это. Ответ на ваш второй вопрос: это зависит. Для этого вам это не нужно. Но вам определенно нужно создать настраиваемый преобразователь зависимостей, потому что Web API в противном случае не знает о вашем контейнере Unity. –