我希望有人可以帮助我解决应用程序的设计和架构问题。
应用程序基本上是用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对象)。
我想知道设计这样一个应用程序的最佳方法是什么?
答案 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的重点在于您的任务需要解决的问题。正如我的例子所示 - 首先关注核心类,你需要一个可靠的设计并继续从那里构建它。