我有一个支持两个数据访问层的应用程序: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&lt;&gt;()时发生。
答案 0 :(得分:0)
另一个解决方案是在DataAccess类实现的接口上添加type属性。然后,您可以检查类型以了解是否需要调用SetAsInitialDalInstanceAndCreateSession方法。我认为上面描述的Initialize方法虽然是一个很好的解决方案