1

在下面的代码中,处置principalCtx会影响userPrin吗?

principalCtx仅用于查找用户还是以某种方式与userPrin对象保持链接?

    UserPrincipal userPrin= null;
    using(PrincipalContext principalCtx as new PrincipalContext(ContextType.Domain)){ 
        userPrin= UserPrincipal.FindByIdentity(principalCtx, IdentityType.SamAccountName, "first.last");
    }
    return userPrin;
4

2 回答 2

1

两者UserPrincipalPrincipalContext都是一次性类,这表明它们的处置在某种程度上是独立的。我在实践中发现,处理PrincipalContext显然确实UserPrincipal. 虽然我仍然能够在处理后访问属性,但如果我尝试在处理后调用类似的方法,我收到有关尝试访问已处理对象的错误。UserPrincipalPrincipalContextGetGroups()UserPrincipalPrincipalContext

但是请记住,仅仅因为它有效果并不意味着您不应该UserPrincipal在使用完对象后单独处理它。不知道哪些单独的资源UserPrincipal可能需要独立于PrincipalContext.

因此,对您的代码的建议摘要:

  1. 不要尝试在释放userPrin后访问principalCtx,或者如果这样做,请确保您只访问不会给您错误的属性,因为我已经验证您可以通过在释放上下文后访问方法来获取错误。
  2. 也要处理或将其包含userPrin一个using块中。
于 2014-02-24T15:31:50.600 回答
0

由于UserPrincipal需要 的实例PrincipalContext,我不会那样做。将您的代码与此进行比较:

StreamReader reader;
using (Stream input = File.OpenRead(@"c:\test.txt"))
{
    reader = new BinaryReader(input);
}

reader.Read();

尽管我们谈论PrincipalContext的是这个问题,而不是文件,但设计是相同的——你永远不知道上下文在幕后的用途。

旁注:BinaryReader实际上有一个重载,可让您指定是要清理还是让其BinaryReader为您清理。

于 2014-02-24T15:39:43.760 回答