2010-11-23 76 views
0

摘要
實際上,我寫一個面向對象的類庫與Active Directory在Visual Basic .NET 2005面向對象設計的氣味?

庫允許管理組織單位,組和用戶打交道。

我一直努力推廣,就像我可以讓我的代碼看起來像(簡體):

Public Interface IDirectoryEntityBase 
    ReadOnly Property DistinguishedName As String 
    ReadOnly Property Domain As String 
    Property Name As String 
    ReadOnly Property Schema As String 
End Interface 

Public Interface IDirectoryEntity 
    Inherits IDirectoryEntryBase 

    Property Login As String 
End Interface 

Public MustInherit Class DirectoryEntity 
    Implements IDirectoryEntity 

    Private _distinguishedName As String 
    Private _domain As String 
    Private _name As String 
    Private _schema As String 

    Public Sub New(ByVal pName As String) 
     Name = pName 
    End Sub 

    Public ReadOnly Property DistinguishedName As String Implements IDirectoryEntryBase.Name 
     Get 
      Return _name 
     End Get 
    End Property 

    Public ReadOnly Property Domain As String Implements IDirectoryEntryBase.Domain 
     Get 
      Return _domain 
     End Get 
    End Property 

    Public Property Name As String Implements IDirectoryEntryBase.Name 
     Get 
      Return _name 
     End Get 
     Set(ByVal value As String) 
      If (String.IsNullOrEmpty(value)) Then Return 
      _name = value.Trim() 
     End Set 
    End Property 

    Public ReadOnly Property Schema As String Implements IDirectoryEntryBase.Schema 
     Get 
      Throw New NotImplementedException() 
     End Get 
    End Property 
End Class 

Public Interface IOrganizationalUnit 
    Inherits IDirectoryEntity 

    ReadOnly Property Children As ICollection(Of IDirectoryEntityBase) 
End Interface 

Public Class OrganizationalUnit 
    Inherits DirectoryEntity 
    Implements IOrganizationalUnit 

    Private _children As ICollection(Of IDirectoryEntityBase) 

    Public Sub New(ByVal pName As String) 
     MyBase.New(pName) 

     _children = new List(Of IDirectoryEntity)() 
    End Sub 

    Public ReadOnly Property Children As ICollection(Of IDirectoryEntityBase) Implements IOrganizationalUnit.Children 
     Get 
      Return _children 
     End Get 
    End Property 
End Class 

Public Interface IGroup 
    Inherits IDirectoryEntity 

    ReadOnly Property Members As ICollection(Of IDirectoryEntity) 
End Interface 

Public Class Group 
    Inherits DirectoryEntity 
    Implements IGroup 

    Private _members As ICollection(Of IDirectoryEntity) 

    Public Sub New(ByVal pName As String) 
     MyBase.New(pName) 

     _members = New List(Of IDirectoryEntity)() 
    End Sub 

    Public ReadOnly Property Members As ICollection(Of IDirectoryEntity) Implements IGroup.Members 
     Get 
      Return _members 
     End Get 
    End Property 
End Class 

現在,當我通過Domain.Add Method加入我的哪個類型的實例到我Domain.Entries,我可能調用Domain.AcceptChanges Method以便處理任何實例。

我的Domain.Entries屬性是ICollection(Of DirectoryEntryBase)

問題
這是當我把我的Domain.AcceptChanges Method,我發現自己具有知道什麼架構或我的工作是什麼類型的,因爲我需要訪問取決於OrganizationalUnit.ChildrenGroup.Members集合他們戴上手銬類型。

Public Class Domain 
    Public Sub AcceptChanges() 
     For Each e As DirectoryEntry In Entries 
      'How may I find out what collection to work with here?' 
     Next 
    End Sub 
End Class 

我曾經想過推廣這個集合,但是再一次,詞彙從一個物體變成另一個。至於OU,我們可能會說子女,當對於一個組,我們會說成員等等。其實這些都不是指同一個現實,所以我會把這個集合概括爲一個不好的理由,我猜。

有什麼想法?

謝謝!

回答

1

我認爲你應該把這個集合作爲一個'BaseList'來處理,這會容納OrganizationalUnit.Children和Group.Members的共同屬性。

然後,Children和Member類可以擴展該基類並添加其他需要在接受更改時發生的自定義功能。

因此,在總結:

public class BaseList 
{ 
public virtual void Persist(...); 
// Common stuff 
} 

public class Children 
{ 
public override void Persist(...) 
{ 
    // do custom stuff 
} 
} 

public class Members 
{ 
public override void Persist(...) 
{ 
    // do custom stuff 
} 
} 

然後你就可以通過「BaseList」的集合,並且循環呼籲每個persist方法。

+0

對於這個BaseList的想法+1,從來沒有想通過這種方式。 – 2010-11-24 00:27:27