私は、db4oとRavenDBという2つのデータアクセスレイヤーをサポートするアプリケーションを持っています。ロジック・クラスは、このような呼び出しは、具体的なデータクラスを取得するために行います。1つのクラスを初期化するためのエレガントなソリューション(ただし別ではありません)
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;
}
ハック:ここ
return DataAccessFactory.GetDataInterface<IApplicationData>().GetAll();
は正しいapplicationDataに(db4oのかRavenDB)を返すDataAccessFactoryにおけるメソッドの具象クラスです私は実現しましたRavenDBのバージョンのDataAccessLayerBaseとそのの場合ステートメント。具体的なクラスがRavenDBクラスの場合は、メソッドを呼び出す必要があります。
この問題を解決する1つの方法は、各DataAccessLayerBaseにInitialize()のような共通のメソッドを実装させることです。 db4o Initialize()メソッドは何もせず、RavenDB Initialize()メソッドは必要なロジックを実行します。次に、このメソッドは単純にInitialize()を呼び出すことができ、どの具体的なクラスであっても気にしません。
これよりも優れたデザインはありますか?私はちょうど説明した修正はまともですが、私は何かが欠けていると思っています。私はこれを解決するより良い、よりエレガントな方法を探しています。私が提案したアプローチの欠点の1つは、他のデータアクセスレイヤーは、RavenDBのためだけに必要であってもInitialize()を実装する必要があるということです。
注:DataAccessFactory.GetDataInterface <>()が呼び出されたときにのみ発生するため、具体的なクラスを作成するときに、この初期化を行うことはできません。
ありがとう、TGH。あなたのオプションは現在の実装のように聞こえます。型をチェックし、必要に応じてメソッドを呼び出します。私は* if *チェックのないより多態的な解決策を望んでいました。 –
ええ、そこには多くの類似点があります。キャストは避けられますが...私はInitialize()を呼び出すあなたのアイデアは実際には最良の多相性に基づくアプローチだと思います。申し訳ありません、私は今より創造的なことはできませんが、このような同じ方法で異なるニーズを持つオブジェクトを処理しようとすると、あなたの質問に記述する2つのソリューションのバリエーションが必要になります。あなたが複数のタイプを持っていれば、少なくともInitialize()アイデアは意味をなさないでしょう...あなたが2つしか持っていなくても、おそらくそれはまだ適切です: - ).... – TGH
私もそう考えています。 Null Design Patternと呼ばれるデザインパターンがあります。基本的に、何もする必要のないデータクラスは何もしません。そうすれば、彼らはすべて同じように扱うことができます。そして、そのメソッドはそのロジックを呼び出すべき場所なので、それはそれを呼び出すための適切な場所です。これを通じて私に話すのを助けてくれてありがとう。 –