在C#中构建帐户类(Active Directory,Gmail等)的最佳方法

时间:2011-05-31 13:12:21

标签: c# oop

我开始开发一组用于存储帐户信息的类。我需要在许多不同类型的帐户(Active Directory,Google Apps和其他帐户)上执行CRUD操作。我正在尝试正确地设计这些类,以便它们符合OO原则,并且它们对未来是灵活的。

为了给您一些背景知识,我将维护和更新感应卡系统,Active Directory,Google Apps帐户以及未来可能的其他几个用户帐户。每个系统都有不同的做事方式,但它们确实有相似之处。我想创建一个我可以编写代码的接口,以便我可以在没有重大更改的情况下放入新的帐户类。

问题在于我认为每种类型的帐户可能需要两个类。一个类应该保存用户信息(例如,名字,姓氏等)但是,我需要一种方法来在每个系统中查找用户。起初我想过将FindUser方法放在类中。如果我们只返回一个用户,这将有效。但是,我可能会要求所有用户名为“Tom”的用户。这可能会返回五个用户。我不希望一个类产生另外四个实例,因为我不知道在哪里存储它们。那么,我的想法是创建一个类,其中包含存储一个或多个仅包含数据的类实例的方法。

例如,在Active Directory中,我将具有以下基本结构:

MainClass:
FindUser()
FindUsers()
List<ADUsers>

ADUsers:
_firstName
_lastName
_userName
_etc.

因此,MainClass将用于执行FindUser / s方法,并且可以通过列表访问用户。

另一个选择是让MainClass FindUser方法返回ADUsers类的实例,FindUsers方法返回ADUsers列表。

我的问题是,这是解决这个整体问题的正确方法吗?不要忘记我必须扩展它以处理所有不同类型的用户系统。上面的例子最终将成为我的基本界面,我将为更复杂的案例进行扩展。

编写实际代码本身不是我的问题(几乎全部完成)。我的问题是在智能设计中妥善安排。非常感谢你的帮助。至于语言规范,我是用C#编写的。

2 个答案:

答案 0 :(得分:2)

我不会在每种类型的用户中放置一个find方法,对象应该不知道它们的持久性。相反,为什么不将事物视为存储库?你有像

这样的东西
IUserRepository<T>
  public T Create()
  public T Load(object identifer);
  public void Save(T user);

等。然后为基本用户提供接口;

IUser
  public object Identifier { get }
  public string Email { get }

等。并为AD用户,Google Apps用户等以及匹配的存储库实施具体版本。您可以根据您的配置或其他任何您喜欢的方式使用工厂模式返回正确类型的存储库吗?

答案 1 :(得分:0)

前言:我熟悉LDAP和ADSI。请阅读有关Google Contacts Data API的一些规范。我只使用非常低级别的牌,使用例如PKCS#11 API,所以我很可能对你正在使用的卡片API一无所知。

我对这个主题的看法是:试图隐藏抽象层背后的差异太多了。他们有不同的查询语言。甚至电子邮件的存储方式也不同:在AD中你有单个“邮件”属性,在google联系人中你有结构数组,每个都有1个强制字段和4个可选字段。 Google API是无状态HTTP请求/响应,ADSI / LDAP是基于会话的状态。

也许如果我有关于您的智能卡API的更多信息,以及您正在设计的系统的功能要求,我会想出更聪明的东西。