4

Areas andDependencyInjectionを使用してモジュール化されたASP.NETMVCアプリケーションを構築しようとしています。このアプリケーションは現在、次のプロジェクトで構成されています。

  • Framework.Contracts(認証サービス、承認、ロギングのインターフェース)
  • フレームワーク(認証サービスの実装、承認、...)
  • Framework.Web(MVC Webアプリケーション)

各プラグインは、MVCエリアプロジェクト、契約、およびサービスの実装で構成されています。

  • EmployeesPlugin.Contracts(IEmployeesServiceのインターフェイス)
  • EmployeesPlugin(IEmployeesServiceの実装)
  • EmployeesPlugin.MVC

Entity Framework DatabaseFirstまたはModelFirstを使用したい(既存のデータベースに接続する必要があるため)。私の問題は、エンティティを大まかに結合する方法がわからないことです。それらを単一の共有DatabaseLayerプロジェクトに入れたくありません。むしろ、Frameworkプロジェクトの中央エンティティ(User、Settings、LogEntriesなど)と各プラグインの追加エンティティ(Employee、Companyなど)を定義したいと思います。

ORMアーキテクチャ:1つまたは複数のモデル(エンティティフレームワーク)を読んだ後、複数のモデル(つまり、複数のデータコンテキスト)を作成することを考えました。実際、私は冗長なコードを持つという考えは好きではありません。

各エンティティのプロパティを公開するインターフェイスを作成することを考えました。これらのインターフェースは、プラグインごとにプロジェクトに配置されます。IEmployee露出FirstNameとのようにLastName。次にIEmployeeRepository、従業員を返し、作成、編集、削除するための作成を開始しました。IEmployeeただし、具体的なクラスがなく、公開するだけでは、従業員の作成は機能しません。

もう1つの問題は、Employeeエンティティに他のプロジェクト/プラグインのエンティティへの参照が含まれていることです。従業員がいくつかのプロジェクトを主催しているとしましょう。したがって、プロジェクトへの参照なしで汎用IEmployeeインターフェースを作成し、プロジェクトへのIEmployeeProjects参照を含むインターフェースを作成することを考えました。そうすれば、両方のadd`IEmployeeProjectsEmployeeを実装する中央データベースレイヤープロジェクトにクラスを作成できます。IEmployee

public class Employee : IEmployee, IEmployeeProjects
{   
    // From IEmployee interface
    public string FirstName { get; set; }
    public string LastName { get; set; }

    // From IEmployeeProject interface
    public virtual ICollection<Project> Projects { get; set; }
}

問題は、EntityFrameworkを使用して物事をまとめる方法がわからないことです。

4

1 に答える 1

1

それらの間のハードな関係を削除することで、緩やかなカップルを作成します。代わりに、ID を使用して他のエンティティを参照します。これは、各プラグインが独自の DbContext を使用することも意味します。

次に、各プラグインでリポジトリを使用して、参照されたエンティティをロードします。これは、各プラグインが、他のプラグインで使用できる個別のアセンブリでリポジトリ インターフェイスを定義する必要があることも意味します。

また、通常は、コアが公開するすべてのエンティティ、サービス、およびリポジトリを定義するコア オブジェクトを作成します。

于 2013-03-05T10:27:39.697 に答える