2010-11-23 9 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.Entries через мой Domain.Add Method, я могу вызовите Domain.AcceptChanges Method так, чтобы обрабатывались все экземпляры.

My Domain.Entries Недвижимость ICollection(Of DirectoryEntryBase).

Вопрос
Это когда я называю Domain.AcceptChanges Method, что я считаю себя наручниками того, чтобы знать, какие схемы или какой типа я работаю, так как мне нужно, чтобы получить доступ к OrganizationalUnit.Children или Group.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 

Я думал об обобщающих этой коллекции, но опять же, словарный запас изменяется от Objet к другому. Что касается OU, мы можем поговорить о Children, когда для группы мы скажем Члены и т. Д. На самом деле это не относится к одной и той же реальности, поэтому я бы обобщил эту коллекцию по плохой причине, Я полагаю.

Любые мысли?

Спасибо!

ответ

1

Я думаю, вам следует разделить коллекцию как, скажем, «BaseList», в которой будут размещаться общие свойства как для OrganizationalUnit.Children, так и для Group.Members.

Затем классы «Дети» и «Участники» могли бы расширить этот базовый класс и добавить другие настраиваемые функции, которые должны произойти, когда вы принимаете изменения.

Так что в итоге:

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» и называют каждый отдельный метод сохраняется.

+0

+1 для этой идеи BaseList, так и не понял. – 2010-11-24 00:27:27

Смежные вопросы