我的应用程序有几个不同的用户类型和自己的成员。例如,我有学生用户和教师用户。我通过自定义MembershipProvider的ValidateUser方法中的活动目录验证我的用户。在查询AD时,我会提取所有相关信息。我想把这些信息放到一个配置文件中,但从我读过的内容和我发现的例子中,你只能定义一个配置文件(如此):
<profile defaultProvider="CustomProfileProvider" enabled="true">
<properties>
<add name="YearLevel" type="String" />
<add name="Name" type="String" />
<add name="Age" type="String" />
</properties>
</profile>
上述个人资料适用于学生,但不适用于教师,他在AD中没有“YearLevel”的值。是否有可能有多个配置文件来完成此任务?或者更容易从AD中添加所有用户类型的所有属性,然后在我的代码中,只需检查它们是什么用户类型然后访问它们的特定属性?
答案 0 :(得分:1)
这里你真的只有2个选项:
您可以使用所有用户类型的字段创建“大”个人资料,然后只访问您当前使用的用户类型的字段。 (我不推荐这个,但它可以快速解决。)
实施自定义配置文件提供程序 - 这根本不是那么难。您可以在此处了解有关此内容的更多信息:http://msdn.microsoft.com/en-us/library/0580x1f5.aspx
答案 1 :(得分:1)
编辑2015-01-26 :嗯...我刚刚起步1,但我认为不应该这样。现在我重读了2年前的问题和我自己的答案,我实际上不要认为配置文件组是启用多个配置文件“类型”的方法。您可以将两种不同类型的属性填充到两个不同的组中(至少是“正交”属性),但您仍需要代码来区分这两者。所以我会选择apiguy或Jim Schubert的答案 ENDEDIT
这不是profile groups的用途吗?像:
<profile>
<properties>
<group name="UserInfo">
<add name="Name"/>
<add name="Age"/>
</group>
<group name="MemberInfo">
<add name="MemberID"/>
<add name="JoinDate"/>
</group>
</properties>
</profile>
答案 2 :(得分:0)
是的,如果您打算使用个人资料模型,我担心您必须指定所有可能的属性。如果你走这条路线,我会建议使用某种代理方式来接受用户,并根据它的类型填充适当的属性。
类似
public static class ProfileProxy<T>
{
public static void FillProperties(T user)
{
if(user is Teacher)
{
//Pull & fill profile properties for teacher
}
else
{
//Pull & fill profile properties for student
}
}
}
我会考虑使用两个不同的表来保持两个对象分开,或者实现自定义配置文件提供程序。
答案 3 :(得分:0)
您可以创建一个对象并将其存储在配置文件中。 例如:
[Serializable]
public class ProfileObject { }
[Serializable]
class StudentProfile : ProfileObject
{
public string Year {get;set;}
public string Name {get;set;}
public string Age {get;set;}
}
[Serializable]
class TeacherProfile : ProfileObject
{
public string Department {get;set;}
public string Tenure {get;set;}
public string Rating {get;set;}
}
在web.config中:
<profile>
...
<properties>
<add name="UserProfile" allowAnonymous="false" type="ProfileObject" serializeAs="Xml"/>
</properties>
</profile>
编辑:我不记得你是否可以使用接口作为类型。将其更改为对象。
通过Profile.UserProfile访问它(冗余,但它可以工作)。 然后,要处理此问题,您必须检查类型:
if(Profile.UserProfile is StudentProfile) { /* do something */ } else
if(Profile.UserProfile is TeacherProfile) { /* do something */ } // etc.
您还可以在配置文件对象中存储泛型(也许是Dictionary?以下是我使用过的实现)
例如:
namespace Model
{
[Serializable]
public class RecentlyViewed : List<Model.Product>
{
public RecentlyViewed() {}
}
}
在web.config中:
<profile>
...
<properties>
<add name="RecentlyViewed" allowAnonymous="false" type="Model.RecentlyViewed" serializeAs="Xml"/>
</properties>
</profile>
我在.NET 3.5中使用过这种方法,我不确定它是否适用于.NET 2或3.我会假设泛型的处理方式相同,因为编译器没有改变。
注意: 将通用对象继承到空对象是必要,因为配置文件设置不喜欢以下内容:
<profile>
...
<properties>
<add name="RecentlyViewed" allowAnonymous="false" type="System.Collections.Generic.List`1[Model.Product]" serializeAs="Xml"/>
</properties>
</profile>
以上是完全合格的IL名称,因为它应该看起来。似乎XML不喜欢刻度线。
我没有研究在Profile对象中存储序列化对象的任何性能问题,因此我不会建议您定期使用所需的任何属性。