用于初始化一个类(但不初始化另一个类)的优雅解决方案

本文关键字:初始化 另一个 解决方案 一个 用于 | 更新日期: 2023-09-27 18:29:31

我有一个支持两个数据访问层的应用程序: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;
}

我实现的破解是转换到RavenDB版本的DataAccessLayerBase和if语句。如果具体的类恰好是RavenDB类,那么我需要在它上面调用一个方法

解决此问题的一种方法是让每个DataAccessLayerBase实现一个通用方法,如Initialize()。db4o Initialize()方法将不执行任何操作,而RavenDB Initialize(()方法则执行必要的逻辑。然后这个方法可以简单地调用Initialize(),而不关心它是哪个具体类。

还有比这更好的设计吗我认为我刚才描述的修复已经足够不错了,但我忍不住觉得我错过了什么。我正在寻找一种更好、更优雅的方法来解决这个问题。我提出的方法的一个缺点是,其他数据访问层必须实现Initialize(),尽管我只需要它用于RavenDB。

注意:我不能在创建具体类时就让它们进行初始化,因为只有在调用DataAccessFactory时才会进行初始化。GetDataInterface<>()。

用于初始化一个类(但不初始化另一个类)的优雅解决方案

另一个解决方案是在DataAccess类实现的接口上添加类型属性。然后,您可以检查类型以了解是否需要调用SetAsInitialDalInstanceAndCreateSession方法。我认为您上面描述的Initialize方法也是一个很好的解决方案,尽管