我的应用程序的架构

时间:2011-01-12 16:14:33

标签: c# architecture

对于你们大多数人来说,这肯定是一个基本问题,但是当我想到它时,它仍然让我感到头疼。

我有一个存储库类,它将域名设置为实例化:

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,我无法在存储库级别打开和关闭我的连接,或者我失去了灵活性,并且存储库正在获取所有内容。

一切都不清楚,因为我的头脑中还不清楚,我只是希望有人可能会告诉我一个方法。

感谢您的支持,

2 个答案:

答案 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应用程序,在单个页面的范围之外使用它会比较棘手,但是您可以创建(例如)上下文的会话缓存,并且如果在一段时间内未使用该对象,则还要定期处理它们。时间。此代码也将具有竞争条件,因此您需要处理该问题,但这是基本想法。这基本上类似于连接池的工作方式。