2016-09-26 29 views
1

「ユーザーサービス」クラスを作成しようとしています。このクラスでは、これを通過する必要のあるメソッドのみを公開しています。このメソッドの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

の定義が含まれていません。私は間違っている?

EDIT:

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

関連する問題