Jeffery Palermoによるタマネギアーキテクチャに基づいた次のアプリケーション構造があります(参照リンク)。つまり、私のコアは何にも依存していません。私のインフラストラクチャは私のコアに依存しています
私のコアにはリポジトリコントラクトがあり、私のインフラストラクチャはそれを実装しています。実装は私のIoCコンテナによって注入されます
Core
-Interfaces
--IRepository<TDomainModel>
-Domain
--Person
Infrastructure
-Data
--Repository<TDomainModel> (Implementation)
-Entities
--Ef.edmx
したがって、具体的なリポジトリの実装(PersonRepositoryなど)を作成した場合、プロジェクト/マップするタイプもわかっているので、これは問題にはなりません。
具体的な実装例:
public class PersonRepository
{
...
public IQueryable<PersonDomainClass> GetByName(string name)
{
return Dbcontext.Person.Where(x => x.name == name).Select(x => new Person());
}
...
}
私が欲しいもの:
public class Repository<TDomainModel> : IRepository<TDomainModel>
{
//Problem 1. We can't set the DbSet to a Domain Model
private DbSet<TDomainModel> dbEntity;
...
public IQueryable<TDomainModel> GetWhere((Expression<Func<TDomainModel, bool>> predicate))
{
//Problem 2. I Don't think this will work because the predicate is ofType TDomainModel
//and not an EF Entity!?
var entities = dbEntity.Where(predicate);
var domainObjects = Mapper.Map <IQueryable<TDomainModel>, IQueryable<TEntityModel>> (entities);
return domainObjects;
}
...
}
私はこれを間違った方法で行っている可能性があるので、他の実装を開きます。
アップデート
みなさんの考えやアドバイスに感謝します。usrは、私が見落としていた非常に良い点を指摘しました。ORMを抽象化すると、ORMが提供するすべての利点が失われます。
私はEFデータベースファースト開発を使用しています。したがって、私のエンティティは、リポジトリの実装とともにインフラストラクチャに含まれています。
タマネギのアーキテクチャに基づいてアプリケーションを構築しているため、ドメインはこれとは別のものです。
私がコードファーストを行っていた場合、最初にドメインを構築し、EFコードを使用してこれをデータベースに変換することが重要なようです。
私は最初にコードを行うことはできません:(
そのため、段階的にEFチーム@MicrosoftのEntityFrameworkDbCotnextPOCOジェネレーターを使用します。これにより、edmxファイルに基づいて永続的な無知なPOCOクラスが生成されます
これは今のところ素晴らしいようです。遅延読み込みと変更の追跡のすべての利点があり、ドメインが生成され、EntityFrameworkが内部でマッピングを処理します。これは私のアプリケーションを簡素化しました:)
したがって、これは私のアーキテクチャの概要ではありません
Core
-Interfaces
--IRepository<TEntity>
---IPersonRepository<Person>
---IFooRepository<Foo>
-Domain
--Person (Auto Generated)
--Foo (Auto Generated)
Infrastructure
-Data
--Repository<TEntity> (Implementation)
---PersonRepository<Person>
---FooRepository<Foo>
-Entities
--Ef.edmx