我的情境是这样的。
我正在使用System.DirectoryServices.AccountManagement来处理AD用户和组。我的主要方法(现在是控制台应用程序)调用一个返回PrincipalSearchResult<Principal>
的方法。这两个对象都实现了IDisposable接口。
如果我返回这个对象,怎么确保我能够处理所有这些可处理的对象?
class Searcher
{
private PrincipalSearchResult<Principal> SearchForObjects(string searchString)
{
PrincipalContext ctx = null;
PrincipalSearcher principalSearcher = null;
Principal principal = null;
ctx = new PrincipalContext(ContextType.Domain, "blah", "dc=blah,dc=com");
principal = new GroupPrincipal(ctx) { Name = searchString };
principalSearcher = new PrincipalSearcher { QueryFilter = principal };
return principalSearcher.FindAll();
}
}
static void Main(string[] args)
{
Searchers searchers = new Searchers();
PrincipalSearchResult<Principal> theGroups = searchers.SearchForGroupsMatching("some*");
foreach (GroupPrincipal group in theGroups)
{
Console.WriteLine(group.DisplayName);
// do stuff...
}
}
传递
PrincipalSearchResult<Principal>
是否真的是一个非常糟糕的想法,原因与未管理对象处理有关?创建托管代理对象会更好吗?
我想象一下,如果我只关心读取属性子集,那么创建一个只包含这些属性的自定义对象可能会更好。在写回时,例如写回到AD组,我只需要将更改后的属性和键传递给方法即可。这将允许我将未管理对象的创建限制为一个范围内。或者这一切都是不必要的,而且更麻烦?对于这个半分散的意识流,我深感抱歉...