2009-03-25 9 views
0

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

Répondre

1

Connaissez-vous "LINQ to active Directory" ?? Check it out sur Codeplex

Cela pourrait être un bon point de départ.

Marc

+0

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

Questions connexes