我有一个UserRepository类,它的职责很少,
1 - 使用少量一次性类从ActiveDirectory查询ADUser
2 - 将此ADUser对象转换为我的业务对象,因为我不想在我的主代码中继续使用“using”。
如何有效处理我的存储库类中的一次性对象,例如我正在使用PrincipalContext,UserPrincipalExtension,PrincipalSearcher等。它们都是一次性的..
问题
我不想在我的repo类中为每个方法添加“using”(比如20个方法),
public static List<MyUser> GetUsersInOU(string ouPath)
{
List<MyUser> users = new List<MyUser>();
using (PrincipalContext pc = MyUtilities.GetPrincipalContext(ouPath))
using (UserPrincipalExtension user = new UserPrincipalExtension(pc))
using (PrincipalSearcher ps = new PrincipalSearcher(user))
{
user.Enabled = true;
foreach (UserPrincipalExtension u in ps.FindAll())
{
users.Add(MyUser.Load(u.SamAccountName));
}
}
return users;
}
编辑 - 脱离上下文
我找到了这个解决方案但它正在使用DirectoryEntry我想通过使用PrincipalContext扩展它但不能这样做:(
答案 0 :(得分:0)
只要您希望使用用户列表,就可以致电GetUsersInOU(string ouPath)
。我假设MyUser
类不是IDisposable
,因此您不必担心using
之外的GetUsersInMyOU
语句 - PrincipalContext, UserPrincipalExtension, PrincipalSearcher
对象会被正确创建并处理掉致电GetUsersInMyOU
。
您可以拥有IUserRepository
:
public interface IUserRepository
{
List<MyUser> GetUsersInOU(string ouPath);
}
然后在IUserRepository
课程中实施UserRepository
:
public class UserRepository : IUserRepository, IDisposable
{
private PrincipalContext _pc;
private UserPrincipalExtension _user;
private PrincipalSearcher _ps;
public UserRepository()
{
_pc = MyUtilities.GetPrincipalContext(ouPath);
_user = new UserPrincipalExtension(pc);
_ps = new PrincipalSearcher(user);
}
public List<MyUser> GetUsersInOU(string ouPath)
{
List<MyUser> users = new List<MyUser>();
user.Enabled = true;
foreach (UserPrincipalExtension u in _ps.FindAll())
{
users.Add(MyUser.Load(u.SamAccountName));
}
return users;
}
public void Dispose()
{
_ps.Dispose();
_user.Dispose();
_pc.Dispose();
}
}
使用这种方法,您可以在构造函数中创建所有IDisposable
个对象,在类中的所有方法中使用它们(无需在using
语句中包含它们的用法)并将它们放在{{{ 1}}方法。
现在你可以像这样调用你的方法:
Dispose()