マイク、あなたが観察したことは本当だと思います。AzureTableStorageをデータストアとして使用するProfileProviderを使用しています。データベースからユーザープロファイルのリストを取得し、それらをメンバーシッププロバイダーからの情報とマージしたかったのです。引数としてユーザー名を指定してProfileBase.Create()を呼び出すと、TableStorageに対してルックアップが実行され、実際にそのユーザー名に関連付けられたデータが取得されることに気付くまで、少し時間がかかりました。私に関する限り、このメソッドCreate()を呼び出すことは誤解を招く可能性があり、Load()またはGet()を期待します。現在、私のコードは次のようになっています。
public IEnumerable<AggregatedUser> GetAllAggregatedUsers()
{
ProfileInfoCollection allProfiles = this.GetAllUsersCore(
ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All)
);
//AggregatedUser is simply a custom Class that holds all the properties (Email, FirstName) that are being used
var allUsers = new List<AggregatedUser>();
AggregatedUser currentUser = null;
MembershipUser currentMember = null;
foreach (ProfileInfo profile in allProfiles)
{
currentUser = null;
// Fetch profile information from profile store
ProfileBase webProfile = ProfileBase.Create(profile.UserName);
// Fetch core information from membership store
currentMember = Membership.FindUsersByName(profile.UserName)[profile.UserName];
if (currentMember == null)
continue;
currentUser = new AggregatedUser();
currentUser.Email = currentMember.Email;
currentUser.FirstName = GetStringValue(webProfile, "FirstName");
currentUser.LastName = GetStringValue(webProfile, "LastName");
currentUser.Roles = Roles.GetRolesForUser(profile.UserName);
currentUser.Username = profile.UserName;
allUsers.Add(currentUser);
}
return allUsers;
}
private String GetStringValue(ProfileBase profile, String valueName)
{
if (profile == null)
return String.Empty;
var propValue = profile.PropertyValues[valueName];
if (propValue == null)
return String.Empty;
return propValue.PropertyValue as String;
}
より良い(より簡単で、よりパフォーマンスの高い)方法はありますか
- プロファイルプロバイダーからすべてのカスタムプロファイル情報を取得し、
- それらをメンバーシッププロバイダー情報とマージして、たとえば管理者ページに表示しますか?
Web Profile Builderを見てきましたが、IMOは、プロキシクラスを生成することにより、カスタムプロファイルプロパティのデザイン時インテリセンスのみを提供します。