从Active Directory读取数据的应用程序的类设计

时间:2015-05-20 19:02:26

标签: c# design-patterns active-directory domain-driven-design directoryservices

我希望有人可以帮助我解决应用程序的设计和架构问题。

应用程序基本上是用C#编写的服务。此服务的目的主要是从Active Directory读取数据并将其保存到本地数据库(该数据稍后将用于报告目的,但不在本应用程序的范围内)。

Active Directory对象和我的数据库字段的属性并不总是具有一对一的映射。例如,假设我读了一个User AD对象的3个属性,并根据这3个属性在数据库列中设置了一个标志(所以在这种情况下,它在AD属性之间进行了3-1的映射)和数据库字段)。

我还将从Active Directory收集扩展属性(我将从XML文件中读取这些属性,并将其传递给Active Directory API查询)。

也可能有自定义AD对象(不是必需的AD对象,如User,Contacts,Groups等。但它们可以是一个全新的自定义对象,默认情况下不存在于AD中,或者可能是特殊用户的扩展对象从标准用户AD对象扩展)。为了读取AD属性,我正在使用.Net的System.DirectoryServices API。

最初我正在探索领域驱动设计来实现这个应用程序,但我没有太多的业务逻辑,可能会有很多未知实体(自定义AD对象)。

我想知道设计这样一个应用程序的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

您应该更多地关注您尝试解决的问题,而不是*DD方法所说的“最佳”问题。原因是没有*驱动设计方法可以回答你现在所处的细节问题。

从广义上讲,您有以下几点:

  • 活动目录系统
  • 活动目录系统的本地化表示
  • 活动目录用户
  • 这些活动目录用户的本地化版本。

您告诉我们,用户的本地化版本取决于活动目录用户的属性。

因此,松散地告诉我,您需要两个类来为用户和方法与两个系统进行交互。

您需要两类用户,因为他们属于不同的系统。当这些单独的系统发生变化时,您希望将该变更的影响与其他用户类分离或最小化。

粗糙的类设计是什么样的?您可能会很幸运,并且能够继承和扩展Microsoft提供的this base User class以访问Active Directory。

根据您知道需要存储的内容,您的本地化用户类需要是您自己创建的。

您还需要a)向User类添加一些交互方法或b)为交互创建数据存储类。

public class MyADUserClass : UserPrincipal {}

public class MyLocalUser
{
    public MyLocalUser(MyADUserClass user)
    {
        //Do something here based upon user.Properties
    }
}

public class MySystemsHandler
{
    public List<MyADUserClass> FetchAllADUsers(...) {}
    public void CopyADUsertoLocal(List<MyADUserClass> ADUsers)
    {
        foreach(MyADUserClass aduser in ADUsers) 
        { 
            MyLocalUser luser = new MyLocalUser(aduser);
            ... //copy to local store here
        }
    }
}

你说:“我没有太多的业务逻辑,可能会有很多未知实体(自定义AD对象)”并且为了证实你的怀疑,域驱动设计不会真正告诉你如何解决系统设计你有的问题。 DDD的重点在于您的任务需要解决的问题。正如我的例子所示 - 首先关注核心类,你需要一个可靠的设计并继续从那里构建它。