2016-09-26 6 views
1

"사용자 서비스"클래스를 만들려고합니다.이 곳에서이 방법을 사용해야합니다. 이 방법 중 하나는 FindById입니다.ID로 사용자를 찾을 수 없음

using System; 
using System.Linq; 
using System.Threading.Tasks; 
using Microsoft.AspNet.Identity; 
using Microsoft.AspNet.Identity.Owin; 
using Microsoft.Owin.Security.DataProtection; 

public interface IUserService : IDisposable 
{ 
    Task<CustomUser> FindByIdAsync(string userId); 
    ICustomUser FindById(string userId); 
} 

public class UserService : UserManager<CustomUser>, IUserService 
{ 
    public UserService(IUserStore<CustomUser> store, IDataProtectionProvider dataProvider) 
     : base(store) 
    { 
     UserValidator = new UserValidator<CustomUser>(this) 
     { 
      AllowOnlyAlphanumericUserNames = false, 
      RequireUniqueEmail = true 
     }; 

     PasswordValidator = new PasswordValidator 
     { 
      RequiredLength = 8, 
      RequireNonLetterOrDigit = true, 
      RequireDigit = true, 
      RequireLowercase = true, 
      RequireUppercase = true, 
     }; 

     UserLockoutEnabledByDefault = true; 
     DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(1); 
     MaxFailedAccessAttemptsBeforeLockout = 5; 

     var dataProtectionProvider = dataProvider; 
     if (dataProtectionProvider != null) 
     { 
      UserTokenProvider = 
       new DataProtectorTokenProvider<CustomUser>(dataProtectionProvider.Create("ASP.NET Identity")); 
     } 
    } 

    public new async Task<ICustomUser> FindByIdAsync(string userId) 
    { 
     return await base.FindByIdAsync(userId); 
    } 

    public ICustomUser FindById(string userId) 
    { 
     return base.FindById(userId); 
    } 
} 

FindByIdAsync 방법은 좋은, 그러나 findById 메소드 방법도 컴파일되지 않습니다 작품 : 여기 내 코드입니다. 내 자동 완성이 방법이 있음을 시사한다,하지만 난 그것을 입력 할 때, 그것은 빨간색이되고 말한다 :

Microsoft.AspNet.Identity.UserManager이

무엇 오전 findById 메소드

에 대한 정의를 포함하지 않는 내가 잘못하고있어?

편집 :

findById 메소드는 UserManagerExtensions (https://msdn.microsoft.com/en-us/library/dn497471(v=vs.108).aspx 참조)에서 비롯됩니다. 확장 클래스를 어떻게 든 확장해야한다는 의미입니까? 내가 실제로하려고하는 것은 IUserService 인 인터페이스를 통해이 메서드를 사용할 수 있도록 허용하지만 거기에 참조를 추가하면 위에서 볼 수있는 것처럼 거의 성공하지 못하도록 시도한 메서드를 구현해야합니다.

+1

왜 downvote입니까? – Bojan

+0

항상 그렇듯이주의를 기울이면 가장 큰 도움이됩니다.이 오류는 findbyid가 없음을 알려줍니다. 그리고 그렇지 않습니다. MSDN을 참조하십시오. https://msdn.microsoft.com/en-us/library/dn613290(v=vs.108).aspx –

+0

@trailmax FindByIdAsync 메서드가 제대로 작동합니다. FindById 메서드를 작동 시키려고합니다. – Bojan

답변

0

You can't call an extension method for base

이유는 매개 변수로 기본을 전달할 수 없으며 확장 방법이 무엇인가하는 것입니다.

메서드를 확장명 대신에 다음과 같은 정적 컨텍스트에서 호출 할 수 있습니다.

public ICustomUser FindById(string userId) 
{ 
    return UserManagerExtentions.FindById(this, userId); 
} 
+0

우리가베이스에서 확장 메소드를 호출 할 수 없다는 말은 옳지 만, 예제에서는베이스에서 확장 메소드를 호출하지 않지만 그베이스를 확장하는 클래스에서 호출합니다. 따라서 나는 (그리고 나는)이 방법에 접근 할 수 있어야한다. 그러나 실제 문제는 내 확장 클래스 때문에 내 자식 클래스 이름에 같은 메서드 이름을 사용할 수 없다는 것입니다. 확장 클래스를 숨기면 자식 클래스 자체에서 호출 할 수 없게됩니다. 무한 루프를 반복하여 호출합니다. 이 문제를 해결하는 방법은 메소드를 다른 것으로 호출하는 것입니다. 적어도 그것이 내가 간 해결책이다. – Bojan