Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于初始化一个类(而不是另一个)的优雅解决方案_C#_Oop_Design Patterns - Fatal编程技术网

C# 用于初始化一个类(而不是另一个)的优雅解决方案

C# 用于初始化一个类(而不是另一个)的优雅解决方案,c#,oop,design-patterns,C#,Oop,Design Patterns,我有一个应用程序支持两个数据访问层:db4o和RavenDB。逻辑类进行如下调用以获得具体的数据类: return DataAccessFactory.GetDataInterface<IApplicationData>().GetAll(); 以下是DataAccessFactory中返回正确ApplicationData db4o或RavenDB具体类的方法: public static T GetDataInterface<T>() where T : class

我有一个应用程序支持两个数据访问层: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位于RavenDb命名空间中。db4o还拥有自己的DataAccessLayerBase

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

有比这更好的设计吗?我认为我刚才描述的修复已经足够好了,但是我忍不住觉得我遗漏了一些东西。我正在寻找一种更好、更优雅的方法来解决这个问题。我提出的方法的一个缺点是,其他数据访问层必须实现Initialize,即使我只在RavenDB中需要它


注意:我不能让具体类在创建时进行初始化,因为只有在调用DataAccessFactory.GetDataInterface时才会发生初始化。

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

谢谢,TGH。您的选项听起来有点像当前的实现:检查类型,并有选择地调用一个方法。我希望有一个更多态的解决方案,没有if检查。是的,有很多相似之处。虽然演员阵容是可以避免的。。。我认为调用Initialize实际上是最好的基于多态性的方法。很抱歉,我现在不能更具创造性,但似乎试图用相同的方法处理具有不同需求的对象需要对您在问题中描述的两种解决方案进行一些修改。如果你有更多的类型,至少初始化的想法会很有意义。。。所以,即使你只有两个,也许这仍然是合适的:——……我也开始这么认为了。有一种设计模式称为空设计模式。基本上,那些不需要做任何事情的数据类不会做任何事情。这样,他们都可以得到同样的待遇。由于该方法是调用该逻辑的地方,因此该方法是调用它的正确位置。谢谢你帮我解决这个问题。