存储库类
本文关键字:存储 | 更新日期: 2023-09-27 18:13:22
我有一个UserRepository类,它的职责很少,
1-使用几个可丢弃类从ActiveDirectory查询ADUser
2-将这个ADUser对象转换为我的业务对象,因为我不想在我的主代码中继续使用"using"。
我如何有效地处理存储库类中的一次性对象,例如,我正在使用PrincipalContext、UserPrincipalExtension、PrincipalSearcher等。它们都是一次性的。。
问题
我不想在我的repo类中的每个方法(比如20个方法(中添加"using">
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来扩展它,但无法做到:(
http://landpyactivedirectory.codeplex.com/SourceControl/latest#Landpy.ActiveDirectory/Landpy.ActiveDirectory/Core/DirectoryEntryRepository.cs
只要调用GetUsersInOU(string ouPath)
,就可以处理用户列表。我假设MyUser
类不是IDisposable
,所以您不必担心GetUsersInMyOU
之外的using
语句-PrincipalContext, UserPrincipalExtension, PrincipalSearcher
对象在调用GetUsersInMyOU
时会被正确创建和处理。
编辑(在@PleaseEach的评论之后(:
你可以有IUserRepository
:
public interface IUserRepository
{
List<MyUser> GetUsersInOU(string ouPath);
}
然后在UserRepository
类中实现IUserRepository
:
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
语句中(,并在Dispose()
方法中处理它们。
现在你可以这样调用你的方法:
using(IUserRepository userRepo = new UserRepository())
{
IList<MyUser> users = userRepo.GetUsersInOU("someOuPath");
}