存储库类

本文关键字:存储 | 更新日期: 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");
}