私は、まったく新しいイントラネットプロジェクトのインフラストラクチャを作成し、ほぼすべてのベストプラクティスに従おうとしました。また、私も言及したいのですが、ゼロからアーキテクチャを作成するのはこれが初めてです。
現在、私のインフラストラクチャの最初のバージョンは準備ができており、正常に機能しています。しかし、次のバージョンで制限付きコンテキスト構造を実装したいと思います。
以下、現状を説明してみました。
DbCore:データ操作を担当します。EntityFramework5コードが最初に使用されました。DbContextクラスは1つだけで、すべてのDbSetが定義されています。また、GenericRepositoryパターンとUnit of Workパターンは、次のインターフェイスに基づいて実装されています。
IGenericRepository
public interface IGenericRepository<TEntity>
where TEntity : class {
void Delete(object id);
void Delete(TEntity entityToDelete);
System.Collections.Generic.IEnumerable<TEntity> Get(System.Linq.Expressions.Expression<Func<TEntity, bool>> filter = null, Func<System.Linq.IQueryable<TEntity>, System.Linq.IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "");
System.Collections.Generic.IEnumerable<TEntity> GetAll();
TEntity GetByID(object id);
System.Collections.Generic.IEnumerable<TEntity> GetWithRawSql(string query, params object[] parameters);
void Insert(TEntity entity);
void Update(TEntity entityToUpdate);
}
IUnitOfWork
public interface IUnitOfWork {
void Dispose();
IGenericRepository<Test> TestRepository {
get;
}
IGenericRepository<Log> LogRepository {
get;
}
void Save();
}
モデル: DbCoreおよびEntity Framework ドメインの責任ある格納エンティティモデル:ビジネスロジックレイヤーを表すと、Modelsプロジェクトに格納されたエンティティオブジェクトのDTOも格納されます。現在、次のインターフェイスIServiceを実装するServiceクラスに格納されているビジネスロジック
public interface IService<TEntity> {
IEnumerable<TEntity> Get();
TEntity GetByID(int id);
void Insert(TEntity entity);
}
このサービスクラスは、ctorパラメーターを介してUnitOfWorkを取得し、操作に使用します。また、エンティティオブジェクトをDTOに、またはその逆に変換するためにAutomapperが実装されました。今後、エンティティモデルに関心がなくなったすべての上位レイヤーは、DTOのみを使用します。したがって、ほぼすべてのプロジェクト(apiおよびwebを含む)がこのプロジェクトを参照します。
共通:ロギングなどの一般的に使用されるライブラリを保存する責任があります。
WebCore: APIやMVCなどのWebベースのプロジェクトで一般的に使用されるライブラリを保存する責任があります。また、MVCベースのプロジェクト用の拡張機能、ハンドラー、フィルターが含まれています。
Api: ASP.Net MVCWebAPIプロジェクトはサービスレイヤーを表します。ドメイン層を消費し、クライアントにサービスを提供します。コントローラーは、ctorパラメーターとしてIServiceインターフェースを取得し、それを使用してドメインレイヤーを介してデータレイヤーにアクセスします。
Web: ASP.Net MVC 4ベースのWebプロジェクトで、ユーザーとの対話を担当します。データにアクセスするためにApiメソッドを使用します。すべてのコントローラーは、HttpClientを介してAPIを接続するIConsumeRepositoryという名前のインターフェイスを取得します。
public interface IConsumeRepository<TEntity> {
Task<TEntity> Create(TEntity TestInfo);
Task Delete(int id);
Task<IEnumerable<TEntity>> Get();
Task<TEntity> Get(int id);
TEntity New();
Task<TEntity> Update(TEntity TestInfo, int entityId);
}
Autofacは、すべてのプロジェクトのIoCとDIを担当します。
今のところ、これは私の現在のインフラストラクチャです。評価する必要があるすべてを説明したと思います。
今、私は次のことを理解しようとしています、
質問1:私が使用した方法に影響を与えてはならないものはありますか?
質問2:境界コンテキストを実装するための最良のアプローチは何ですか?最近、Julie Lermanのビデオを見て、たくさんのサンプルプロジェクトをレビューしました。DbContextからBCを派生させるのを見た一般的なこと。しかし、私は確信が持てませんでした。BCはDbCore(データアクセス)層ではなくドメイン(ビジネスロジック)層にあるべきだと思っていたからです。
質問3:前述したように、私のApiプロジェクトとWebプロジェクトはDTOを使用しているため、両方ともドメインレイヤーを参照する必要があります。しかし、APIを使用してUIからビジネスレイヤーを分離し、エンティティ用にそれらを再度結合しているため、私はそれが好きではありませんでした。しかし、私はこれより良い方法を見つけることができませんでした。
これは長い質問になりましたが、より良いアーキテクチャを作成するためにあなたのアイデアを私と共有していただければ幸いです。