2009-08-25 95 views
1

对于我为当前客户端创建的几个应用程序,我共享了用户帐户。这意味着一个应用程序中的每个帐户都应该存在于其他应用程序中。
每个应用程序都有自己的一套设置。
应用程序数量和设置本身将会是真正随时间而改变的部分,所以我想将它们分开。我应该为这种情况使用什么样的模式?

数据存储通过IRepository类(XMLRepository,SQLRepository等)进行访问。 他们将实际的数据访问逻辑抽象出来。 为随后

public T GetSetting<T>(IUser user) where T : ISetting 

由于一个ISettings类的字段将每种类型的不同我估计,它的实际设置类,应该知道如何来填补它的SettingsService类应该能够得到一个ISetting类自己的领域,但它不知道如何获得价值观。
然而,存储库会知道如何访问数据,但它不知道将它们放在哪里。

GetSetting实际上是一种工厂方法,如果我没有错。我觉得这个问题不是新鲜事,可能有很好的模式来解决这个问题。

我有什么选择?

回答

0

对于每个具体类型的ISetting,您都需要某种工厂,可以从Repository返回的数据中创建具体的SomeSetting实例。

这样的工厂应该如何工作取决于您如何设想设置持久性架构。你对每种类型的ISetting都有一个自定义模式吗,或者你是否简单地序列化和反序列化BLOB/XML中的设置?

在第一种情况下,您需要为每个设置模式定制存储库。这是一个简单的场景,因为每个专门的存储库只会作为自定义工厂。

在另一种情况下,您可以将元数据与BLOB一起保存,该BLOB存储要使用哪个自定义工厂来反序列化BLOB,或者简单地说是序列化BLOB的类型(然后可以使用序列化API。 NET来序列化和反序列化对象)。

+0

所以你说的是我应该在我的仓库(每个ISetting实现的专用仓库)中有自定义的映射逻辑。 虽然我会尝试第二种方法,因为Linq2Sql生成的类上的元数据已经有了这些数据。 – 2009-08-25 12:37:35

+0

这就是我们在服务器场中的配置设置所做的事情:简单地将表中的配置序列化,并且还包含序列化类型的程序集限定名称。这允许我们再次反序列化BLOB。但请注意版本问题。 – 2009-08-25 13:14:49

相关问题