我有一个存储库类,它将域名设置为实例化:
public class RepositoryUserAD : IRepositoryUserAD , IDisposable
{
PrincipalContext context;
public RepositoryUserAD(string domainName)
{
if (string.IsNullOrEmpty(domainName))
throw new Exception("the domainName cannot be null or empty");
DomainName = domainName;
context = new PrincipalContext(ContextType.Domain, DomainName);
}
public UserPrincipal GetUser(string username)
{
UserPrincipal foundUser = null;
foundUser = UserPrincipal.FindByIdentity(context, username);
return foundUser;
}
public void Dispose()
{
context.Dispose();
}
}
这是我的问题。如果我这样工作就可以,但是我不喜欢让我的上下文打开课程并关闭处理课程。 我也可以使用一个使用块,但后来我面临另一个问题,因为我丢失了对上下文的引用,从而失去了对象的引用,或者至少是我没有得到的属性。
我的架构如下
Repository r = new Repository();
Service s = new Service(r);
我被撕成两半,因为在我的一般方法中,我希望能够在服务中过滤我的查询并要求存储库真正获取数据。但是在这里使用AD,我无法在存储库级别打开和关闭我的连接,或者我失去了灵活性,并且存储库正在获取所有内容。
一切都不清楚,因为我的头脑中还不清楚,我只是希望有人可能会告诉我一个方法。
感谢您的支持,
答案 0 :(得分:0)
Service
班做什么?
这个怎么样:
public class RepositoryUserAD : IRepositoryUserAD
{
private readonly PrincipalContext context;
public RepositoryUserAD(PrincipalContext c)
{
context = c;
}
public UserPrincipal GetUser(string username)
{
return UserPrincipal.FindByIdentity(context, username);
}
}
通过将上下文注入存储库,存储库不再负责决定何时处置上下文。存储库的“调用者”负责它,这是一件好事,因为存储库不知道PrincipalContext是否仍然需要稍后(例如,由另一个存储库)。
答案 1 :(得分:0)
我假设有一些原因你不仅仅是创造&破坏每种方法的背景,效率?
我会创建一个以某种方式缓存上下文的上下文工厂,例如。
public class ContextFactory {
private List<PrincipalContext> contexts = new List<PrincipalContext>();
public PrincipalContext GetPrincipalContext(ContextType contextType, string domainName)
{
PrincipalContext existingContext = contexts.First(item=>item.ContextType==contextType &&
item.DomainName == domainName);
if (existingContext == null) {
existingContext = new PrincipalContext(contextType,domainName);
contexts.Add(existingContext);
}
return(existingContext);
}
}
public void Dispose()
{
foreach (PrincipalContext context in contexts) {
context.Dispose();
}
}
}
然后,在您想要使用它的任何范围内,创建该类的新实例并使用它来获取上下文,并在最后处置它。如果这是一个Web应用程序,在单个页面的范围之外使用它会比较棘手,但是您可以创建(例如)上下文的会话缓存,并且如果在一段时间内未使用该对象,则还要定期处理它们。时间。此代码也将具有竞争条件,因此您需要处理该问题,但这是基本想法。这基本上类似于连接池的工作方式。