存储库类

时间:2015-09-18 10:04:44

标签: c# oop

我有一个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扩展它但不能这样做:(

http://landpyactivedirectory.codeplex.com/SourceControl/latest#Landpy.ActiveDirectory/Landpy.ActiveDirectory/Core/DirectoryEntryRepository.cs

1 个答案:

答案 0 :(得分:0)

只要您希望使用用户列表,就可以致电GetUsersInOU(string ouPath)。我假设MyUser类不是IDisposable,因此您不必担心using之外的GetUsersInMyOU语句 - PrincipalContext, UserPrincipalExtension, PrincipalSearcher对象会被正确创建并处理掉致电GetUsersInMyOU

编辑(在@ PleaseTeach的评论之后):

您可以拥有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()