摘要
我实际上正在编写一个面向对象的类库,用于处理Visual Basic .NET 2005中的Active Directory。
该库允许管理组织单位,组和用户。
我尽力推广我的代码看起来像(简化):
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
时,我可以调用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
集合取决于他们的类型。
{{1}}
我考虑过对这个集合进行概括,但是再一次,词汇从一个对象变为另一个。至于OU,我们可能会谈论 Children ,对于一个Group,我们会说 Members 等等。事实上,这些并不是指同一个现实,所以我猜想,我会把这个集合归结为一个不好的理由。
有什么想法吗?
谢谢!
答案 0 :(得分: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
”的集合并调用每个单独的持久化方法。