私のソリューションは、現在の(悲しい)状態だで:Entity Frameworkの円形のdll参照
私はとらわれない自分のビジネス層データ・プロバイダをしたい(良いことということではないのですか?)だけでインターフェイスを持ちますNHibernateやLinqを使ってEFをXmlに切り替えることができます。あるいは私の上司が使用したい永続プロバイダのタイプ(またはこのプロジェクトがすべて完了してから2秒後には必然的に作成される新しい上位のもの)に切り替えることができます。
IPersistenceProvider
はそのインターフェイスであり、Unity(ゲームプラットフォーム、DIコンテナではない)を注入するだけです。私にとって、IPersistenceProvider
はデータレイヤーに属しており、私の履歴書(またはプロジェクト)に新しい永続性のパラダイムを追加する必要があるため、フォルダ(たとえばEntityFramework
)を追加し続けることができます。
したがって、私のビジネスdllは私のデータdllに依存しています。ここではデータのdllに依存し、ビジネスDLL内のいくつかのコードです:
using System;
using Atlas.Data.Kernel;
namespace Atlas.Business.Kernel
{
public abstract class BusinessObject
{
public BusinessObject(IPersistenceProvider p)
{
}
public Guid Id;
}
}
私もDatabaseContext
は、データ層に属する私のように感じます。しかし、EFでは、DbSet
の具体的な型を参照しています。つまり、Atlas データのカーネルdllは、円dll参照を行うように、ビジネスのカーネルdllに依存する必要があります。エンプラス(それはさらにフランス語です)、ビジネス層のコンクリート型を指し示すデータレイヤーが私の匂いに似ています。 DatabaseContext
はビジネスdllに生きていきたいと思っていますが、それは私のビジネス層を特定の永続戦略案と結びつけています。
解決方法私はそれを1つのdllに崩壊させることができます(そして、私は以前のプロジェクトでそのことをやっていました)が、それはうんざりしていて、.Net Architectsクラブに入ることはできません。彼らは私の "1 N too few"アーキテクチャーのために私を嘲笑し、私を会議から笑い飛ばします。 WWDED? (ディノエスポジトは何ですか?)
IPersistenceProviderの目的は何ですか? –
@SergeyBerezovskiy、それはブリッジのOOパターンのブリッジインターフェース/抽象化です。コンクリート持続性プロバイダ(例えば、「EFPersistenceProvider」)がそれを実装するだろう。 – toddmo
あなたのロジック(循環依存性が必要です)に欠陥があるようです。あるいは、あなたのパターン選択は仕事には最適ではないかもしれません。私。なぜビジネス層に依存する必要があるのかわかりません。明確ではない、多分あなたは具体的なクラスを持つ小さなプロジェクトを作り、それを紹介するべきです。 – NSGaga