2017-02-18 6 views
0

私のソリューションは、現在の(悲しい)状態だで:Entity Frameworkの円形のdll参照

My solution in it's current state

私はとらわれない自分のビジネス層データ・プロバイダをしたい(良いことということではないのですか?)だけでインターフェイスを持ちます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? (ディノエスポジトは何ですか?

+0

IPersistenceProviderの目的は何ですか? –

+0

@SergeyBerezovskiy、それはブリッジのOOパターンのブリッジインターフェース/抽象化です。コンクリート持続性プロバイダ(例えば、「EFPersistenceProvider」)がそれを実装するだろう。 – toddmo

+0

あなたのロジック(循環依存性が必要です)に欠陥があるようです。あるいは、あなたのパターン選択は仕事には最適ではないかもしれません。私。なぜビジネス層に依存する必要があるのか​​わかりません。明確ではない、多分あなたは具体的なクラスを持つ小さなプロジェクトを作り、それを紹介するべきです。 – NSGaga

答えて

1

実装からの分割宣言。

EntityFrameworkサブディレクトリは、EFのものとIPersistenceProviderの実装を含む別のアセンブリ(AtlasDataKernelEFなど)であり、循環参照を解決する必要があります。

また、実際に別のORMを使用する必要がある場合は、すべてのEFライブラリを削除した本番実行可能ファイルを取得します。

EFデータアクセスをどのようにインスタンス化するかをスケッチすることはできませんが、確かにそれをある種のファクトリクラスでラップする必要があります。

+0

明確にするため、' AtlasDataKernelDataEF'は 'AtlasKernalBusiness'と' AtlasKernalData'に依存します。 'AtlasKernalData'と' AtlasKernalBusiness'は 'EntityFramework'への参照を持たず、' AtlasDataKernelDataEF'だけが行います。そして、 'AtlasDataKernelDataEF.PersistenceProvider'はDI経由でインスタンス化され、' BusinessObject'に与えられます。そこにはdllへの参照がありません。(b/c DIはちょうどそのように動作します) – toddmo

1

プロジェクトAtlasBusinessKernelはAtalsDataKernalクラス内の任意のリソースを参照するべきではありません。 AtalsBusinessKernelが使用する必要があるAtalsDataKernal内のリソースは、AtalasBusinessKernalプロジェクト内のインターフェースとして表される必要があります.IDataConextインターフェースまたはリポジトリー・インターフェースである可能性があります。

これは、実際にAtalsBusinessKernalプロジェクトを使用している3つ目のプロジェクト(UIを表すWebアプリケーションまたはコンソールアプリケーションなど)がある場合にのみ機能します。このプロジェクトは、好ましくはDIを使用してDatabaseContextをインスタンス化する役割を担います。

// In your AtlasDataKernal 
public class DatabaseContext : IDataContext 
{ 
     // implementation 
} 

// In your AtlasBusinessKernal 
public class MyBusinessLogic 
{ 
    private IDataContext dataContext; 
    public MyBusinessLogic(IDataContext context) 
    { 
     this.dataContext = context; 
    } 
} 
// In your web application or whatever project type it might be 
public class MyWebApp 
{ 
     public DoSomeThing() 
     { 
      IDataContext context = new DatabaseContext(); 
      MyBusinessLogic logic = new MyBusinessLogic(context); 
     } 
} 
+0

ここで何をしていますか? 'IDatabaseContext'は' IPersistenceProvider 'で、' MyBusinessLogic'はすべての自分のビジネスオブジェクトのベースとなる 'DatabaseObject'です。しかし、 'IPersistenceProvider 'と 'DatabaseObject'はDataに存在していますが、彼らは私が推測するようにビジネスに住むことができます。彼らはちょうど私にとってData-yと思われました。 – toddmo

+0

S/Oへようこそ。 +1 – toddmo

関連する問題