1

Active Directory から個人に関する情報を返す WCF サービスを作成しています。個人の詳細を返すだけでなく、マネージャーのユーザー名とフルネームも返す必要があります。

私はこれを次のようにコーディングし始めました:...

[DataContract]
public class ADPerson
{
    Guid objectGuid;
    Guid managerObjectGuid;
    string username;
    string displayname;

    [DataMember]
    public string Username 
    { 
        get { return this.username; }
        set { this.username = value; }
    }
    [DataMember]
    public string DisplayName
    { 
        get { return this.displayName; }
        set { this.displayName = value; }
    }
    [DataMember]
    public ADPerson Manager
    { 
        get { return new ADPerson(this.managerObjectGuid); }
        set { this.managerObjectGuid = value.objectGuid; }
    }

    /* ... */

}

...しかし、これには停止条件がないことに気付きました。つまり、マネージャーが定義されていないユーザー (CEO など) に到達するまで、オブジェクト グラフを上方向に移動します。

ADPerson クラスを再利用しながらこの停止条件を設定する良い方法はありますか、それともマネージャーの詳細を取得する別の方法を提供する必要がありますか (たとえば、表示したい詳細を自分のフィールドに入れるなど) Manager プロパティから DataMember を削除するか、マネージャーのマネージャーではない ADPerson フィールドのサブセットを提示する ADManager クラスを作成しますか?

これは、問題を解決するのが簡単な別のケースですが、問題の最善の解決策が何であるかを知ることは私を悩ませます.

前もって感謝します、

JB

4

2 に答える 2

2

XML での継承の使用は、循環参照 ( 「従業員 A にはマネージャー B がいます。マネージャー B を印刷するには、彼の従業員を印刷する必要があります。そのうちの 1 人は従業員 A です...」 ) を考えると、面倒なことになります。

このコードは、DataContractSerializer を使用すると、これが機能しないことを示しています。

[ServiceContract]
public class NestedDataService
{
    [OperationContract]
    public Person FindPerson()
    {
        var person = new Person { Name = "E.M. Ployee" };
        var manager = new Person { Name = "M.A. Nager" };

        manager.Employees = new List<Person>();
        manager.Employees.Add(person);

        person.Manager = manager;

        return person;
    }
}

[DataContract]
public class Person
{
    [DataMember]
    public String Name { get; set; }

    [DataMember]
    public Person Manager { get; set; }

    [DataMember]
    public List<Person> Employees { get; set; }
}

AD からいくつかの ( ? ) G/UUID を使用し、その ID を使用してクライアント側でそれらを再リンクします。次に、従業員 A にはpublic ADPerson Managerもうプロパティがありません (または、少なくともシリアライザーに関する限りではありません) が、次のpublic UUID ManagerIDように実装できます。

public UUID ManagerID 
{ 
    get 
        { 
            return Manager != null ? Manager.UUID : null;
        }
}

ADPersons要求された人物に関連する人物が存在する場合、それらを検索できるようにするために、そのリストを送信する必要があるため、これにより 1 人の人物を返すことが制限されます。

于 2012-10-08T12:51:44.750 に答える
1

私の意見では、与えられた情報に基づいて、最善の解決策は、次のように、シリアル化するプロパティを手元のクラスで表示し、マネージャーから DataMember 属性を削除することです。

[DataContract] 
public class ADPerson 
{ 
    Guid objectGuid; 
    Guid managerObjectGuid; 
    string username; 
    string displayname; 

    [DataMember] 
    public string Username  
    {  
        get { return this.username; } 
        set { this.username = value; } 
    } 
    [DataMember] 
    public string DisplayName 
    {  
        get { return this.displayName; } 
        set { this.displayName = value; } 
    } 
    public ADPerson Manager 
    {  
        get { return new ADPerson(this.managerObjectGuid); } 
        set { this.managerObjectGuid = value.objectGuid; } 
    } 
    [DataMember] 
    public string ManagerUsername
    {  
        get { return this.Manager.Username; } 
    } 
    [DataMember] 
    public string ManagerName
    {  
        get { return this.Manager.DisplayName; } 
    } 
} 

そして、publicあなたがそうしたくなければ、そうである必要さえありません。

于 2012-10-08T12:52:04.863 に答える