2014-07-14 3 views
23

은 내가 ASP.NET MVC 5 ID 공급자의 기능을 시도 할 수있는이 샘플을 다운로드 , 서비스, 작업 단위 및 문제없이 다른 것들.ID 공급자와 유니티 의존성 주입

하지만 이제 Unity DI를 설치할 때 ID 공급자를 사용하는 인터페이스 및 DI에 많은 문제가 있습니다.

방금 ​​예제의 코드를 다운로드하고 Unity DI를 구성했지만 Identity Membership에 Unity를 사용하고 싶지 않습니다. Unity DI를 사용하고 싶습니다. (IRepository, IService,

현재 유형, Microsoft.AspNet.Identity.IUserStore`1 [Ecoavantis.Interactive.GCI.Models : 나는 사용자를 등록 할 때 등 IUnitOfWork)

는이 오류가 있습니다. ApplicationUser], 은 인터페이스이며 구성 할 수 없습니다. 매핑이 누락 되었습니까?

나는 그들이 내가 이런 일을 포함해야했다있는 일부 게시물을 읽고,하지만 난

container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager()); 
      container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager()); 

는 사람이 제발 도와 드릴까요 ... ID 공급자의 의존성을 주입 할 필요가 없습니다?

코드 예 :

/// <summary>Registers the type mappings with the Unity container.</summary> 
     /// <param name="container">The unity container to configure.</param> 
     /// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to 
     /// change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks> 
     public static void RegisterTypes(IUnityContainer container) 
     { 
      // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements. 
      // container.LoadConfiguration(); 
      // TODO: Register your types here 


      //container.RegisterType<DbContext, ApplicationDbContext>(new ContainerControlledLifetimeManager()); 
      container.RegisterType<IUnitOfWorkAsync, UnitOfWork>(new PerRequestLifetimeManager()); 
      container.RegisterType<IMainPanelService, MainPanelService>(); 
      container.RegisterType(typeof (IRepositoryAsync<>), typeof (Repository<>)); 
      container.RegisterType<IDataContextAsync, ecoavantisinteractivegciContext>(new PerRequestLifetimeManager()); 
     } 
+0

ApplicationUser 클래스는 어떤 모양입니까? 그것은 그것이 인터페이스 일 때 클래스로서 사용되고 있다고 말하는 것입니다. 애플리케이션 사용자 인터페이스를 사용하는 경우 해당 인터페이스와 구현을위한 DI를 구성하려고 했습니까? – grimurd

+0

예, 시도했지만 작동하지 않습니다 ... 비슷한 질문이 있습니다. http://stackoverflow.com/questions/24731426/register-iauthenticationmanager-with-unity – chemitaxis

답변

38

좋아, 내 문제를 해결 한 ... 나는이 방법으로 종속성을 주입했지만,이 작업의 이유를 잘 이해하지 못하는

신원은 내 동맹과 함께 잘 작동합니다.

container.RegisterType<AccountController>(new InjectionConstructor()); 
container.RegisterType<RolesAdminController>(new InjectionConstructor()); 
container.RegisterType<ManageController>(new InjectionConstructor()); 
container.RegisterType<UsersAdminController>(new InjectionConstructor()); 
+2

(파티가 늦어서). 이러한 지침은 AccountController를 만들 때 매개 변수가 적은 생성자 (InjectionConstructor-object가 비어 있음)를 사용하도록 만듭니다. 그렇지 않으면 Unity는 '가장 많이 지정된'생성자를 해결하려고 시도합니다 (실패 할 것입니다). – Dribbel

+2

또는 [InjectionConstructor] 특성을 AccountController의 빈 생성자에 배치하십시오. –

9

감사합니다 chemitaxis! 의견을 말할 담당자가 충분하지 않기 때문에 새로운 대답을 올리려고합니다. 나는 내가 User 모델 속성 확장에도 불구하고, 단순히 첫번째 AccountController을 등록하는 것은 나를 위해 일한 것 때문에 chemitaxis 자신의 마지막 3 컨트롤러를 만들어 가정입니다 : 내 경우

container.RegisterType<AccountController>(new InjectionConstructor()); 
13

을 나는 UnityConfig에 다음을 추가 RegisterComponents 메서드의 .cs.

container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(); 
0

chemitaxis 및 hvaughan3 대답에 대한 업데이트. 사용자 등록을 시도 할 때 발생한다고 말하기 때문에 아마도 AccountController 표준에있을 것입니다. 이에 대한 원래의 문제는 유니티 예를 들어, 두 개의 매개 변수로 생성자를 호출하려고한다는 것입니다 :

public AccountController(
    ApplicationUserManager userManager, 
    ApplicationSignInManager signInManager) 
{ 
    UserManager = userManager; 
    SignInManager = signInManager; 
} 

다음 라인 대신 매개 변수가없는 생성자를 호출하는 유니티에게하고 아무것도 필요하지 않습니다.

container.RegisterType<AccountController>(new InjectionConstructor()); 

이 설명이 도움이되기를 바랍니다.