J'ai utilisé plusieurs tuts différents afin de construire un modèle LINQ-LDAP. Je l'ai à peu près terminé, mais je rencontre des problèmes pour essayer de lier les données renvoyées à une classe.Mappage de données LDAP vers des classes .NET (LINQ)
Je fais la partie inverse en affectant des attributs personnalisés aux propriétés de la classe qui sont les noms réels des champs de base de données.
Voici un exemple de la classe, ainsi que l'attribut personnalisé (les DirectorySchemaAttribute
et DirectoryRootAttribute
mises en œuvre ne sont pas inclus ... ces pièces fonctionnent correctement):
[DirectorySchema("C4User"), DirectoryRoot("o=c4, ou=users")]
class User
{
[DirectoryAttribute("cn")]
public string Username { get; set; }
[DirectoryAttribute("userpassword")]
public string Password { get; set; }
[DirectoryAttribute("C4-Parent")]
public string Parent { get; set; }
}
/// <summary>
/// Specifies the underlying attribute to query for in the directory.
/// </summary>
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class DirectoryAttributeAttribute : Attribute
{
private string attribute;
private DirectoryAttributeType type;
/// <summary>
/// Creates a new attribute binding attribute for a entity class field or property.
/// </summary>
/// <param name="attribute">Name of the attribute to query for.</param>
public DirectoryAttributeAttribute(string attribute)
{
this.attribute = attribute;
this.type = DirectoryAttributeType.Ldap;
}
/// <summary>
/// Creates a new attribute binding attribute for a entity class field or property.
/// </summary>
/// <param name="attribute">Name of the attribute to query for.</param>
/// <param name="type">Type of the underlying query source to get the attribute from.</param>
public DirectoryAttributeAttribute(string attribute, DirectoryAttributeType type)
{
this.attribute = attribute;
this.type = type;
}
/// <summary>
/// Name of the attribute to query for.
/// </summary>
public string Attribute
{
get { return attribute; }
set { attribute = value; }
}
/// <summary>
/// Type of the underlying query source to get the attribute from.
/// </summary>
public DirectoryAttributeType Type
{
get { return type; }
set { type = value; }
}
}
Alors, je suis mon peuplant attributs pour ma recherche LDAP avec la valeur DirectoryAttributeAttribute :: Name de la propriété. Si ce n'est pas spécifié, alors j'utilise simplement le nom du type de la propriété. Donc, en substance, User.Username correspond à "cn" et ainsi de suite. Je me demande quelle est la meilleure façon de faire l'inverse. Donc, si j'obtiens un résultat LDAP qui contient un champ nommé "cn", comment puis-je trouver la propriété qui a un DirectoryAttributeAttribute.Name qui est égal à "cn". Je travaille sur un foreach qui obtient les attributs personnalisés pour chaque propriété, mais alors je dois exécuter ce foreach pour chaque champ dans le jeu de résultats :(Genre de lourdeur.Peut-on penser à une meilleure façon de le faire?
Voici le code de la fonction qui détermine le nom du champ qu'une propriété est mise en correspondance:
private string GetFieldName(System.Reflection.MemberInfo member)
{
DirectoryAttributeAttribute[] da = member.GetCustomAttributes(typeof(DirectoryAttributeAttribute), false) as DirectoryAttributeAttribute[];
if (da != null && da.Length != 0)
{
if (da[0].Type == DirectoryAttributeType.ActiveDs)
throw new InvalidOperationException("Can't execute query filters for IADs* properties.");
else
return da[0].Attribute;
}
else
return member.Name;
}
Merci, Chris
Nice. Les tuts que je regardais étaient en fait écrits par la même personne qui affichait les cours. Il est utile d'avoir tout le code maintenant. J'ai encore du mal à le faire supporter LDAP (plutôt que AD), mais votre message a résolu ma question initiale. Merci!! – regex