1

У меня есть по умолчанию 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

ответ

1

Вы должны удалить конструктор без параметров.

Затем вам нужно настроить настраиваемый преобразователь зависимостей, который будет в основном обернуть ваш контейнер Unity. См. http://www.asp.net/web-api/overview/advanced/dependency-injection

После этого убедитесь, что вы зарегистрировали все свои типы. Например, я не вижу регистрации для ApplicationUserManager. Вы регистрируете UserManager<ApplicationUser, int>, но не ApplicationUserManager, что и попытается решить контейнер IoC.

+0

'ApplicationUserManager' есть:' .RegisterType () ' – sreginogemoh

+0

Нужно ли мне пакет Unity.Mvc? Это швы, как будто мне это больше не нужно? – sreginogemoh

+0

@sreginogemoh, вы правы. Прости, я пропустил это. Ответ на ваш второй вопрос: это зависит. Для этого вам это не нужно. Но вам определенно нужно создать настраиваемый преобразователь зависимостей, потому что Web API в противном случае не знает о вашем контейнере Unity. –

Смежные вопросы