【发布时间】:2012-03-31 00:24:22
【问题描述】:
我有一个应用程序支持两个数据访问层:db4o 和 RavenDB。逻辑类通过这样的调用来获取具体的数据类:
return DataAccessFactory.GetDataInterface<IApplicationData>().GetAll();
这是 DataAccessFactory 中返回正确 ApplicationData(db4o 或 RavenDB)具体类的方法:
public static T GetDataInterface<T>() where T : class
{
T theObject = // Code here to get the object. Not relevant to this question.
// Begin HACK
DataAccessLayerBase theObjectAsRavenDalBase = theObject as DataAccessLayerBase;
if (theObjectAsRavenDalBase != null)
{
theObjectAsRavenDalBase.SetAsInitialDalInstanceAndCreateSession();
}
// End HACK
return theObject as T;
}
我实施的 hack 是转换为 RavenDB 的 DataAccessLayerBase 版本和 if 语句。如果具体类恰好是 RavenDB 类,那么我需要调用它的方法。 (此处显示的 DataAccessLayerBase 位于 RavenDb 命名空间中。db4o 也是他自己的 DataAccessLayerBase。)
解决此问题的一种方法是让每个 DataAccessLayerBase 实现一个通用方法,例如 Initialize()。 db4o Initialize() 方法什么都不做,而 RavenDB Initialize() 方法将执行必要的逻辑。然后这个方法可以简单地调用 Initialize() 而不关心它是哪个具体的类。
还有比这更好的设计吗?我认为我刚才描述的修复已经足够好,但我不禁认为我遗漏了一些东西。我正在寻找一种更好、更优雅的方法来解决这个问题。我提出的方法的一个缺点是其他数据访问层必须随后实现 Initialize(),即使我只需要 RavenDB。
注意:我不能只让具体类在创建时进行初始化,因为它应该只在调用 DataAccessFactory.GetDataInterface() 时发生。
【问题讨论】:
标签: c# oop design-patterns