私は中途採用の哲学的建築危機を経験しています。クライアントコード(UI、Webサービス、MVC、MVPなど)と見なされるものとサービスレイヤーの間に非常に明確な線があります。ただし、サービスレイヤーからの線は、1分ごとにぼやけてきています。そして、それはすべて、Linqを使用してコードをクエリする機能と遅延読み込みの概念から始まりました。
コントラクトと実装で構成されるビジネスレイヤーを作成しました。その場合、実装は他のコントラクトなどに依存する可能性があります。これは、DIを備えたIoCコンテナを介して処理されます。DataAccessを処理するサービスが1つあり、それが行うのはUnitOfWorkを返すことだけです。このUnitOfWorkは、拡張時にトランザクションを作成し、Commitメソッドでデータをコミットします。[この記事を見る(Testability and Entity Framework 4.0) ]:
public interface IUnitOfWork : IDisposable {
IRepository<T> GetRepository<T>() where T : class;
void Commit();
}
リポジトリは汎用であり、2つの実装(EF4とInMemoryデータストア)に対して機能します。Tは、データベーススキーマまたはEF4マッピングから生成されるPOCOで構成されます。テスト容易性はリポジトリ設計に組み込まれています。インメモリ実装を活用して、期待どおりの結果を表明できます。
public interface IRepository<T> where T : class {
IQueryable<T> Table { get; }
void Add(T entity);
void Remove(T entity);
}
データソースは抽象化されていますが、IQueryableを使用すると、ビジネスロジック内の任意の場所にクエリを作成できます。これが例です。
public interface IFoo {
Bar[] GetAll();
}
public class FooImpl : IFoo {
IDataAccess _dataAccess;
public FooImpl(IDataAccess dataAccess) {
_dataAccess = dataAccess;
}
public Bar[] GetAll() {
Bar[] output;
using (var work = _dataAccess.DoWork()) {
output = work.GetRepository<Bar>().Table.ToArray();
}
return output;
}
}
これで、複雑なフィルターを使用して結合を実行すると、クエリがさらに複雑になる可能性があることがわかります。
したがって、私の質問は次のとおりです。
- BLLとDALの間に明確な区別がないことは重要ですか?。
- InMemory抽象化のように機能するリポジトリ層の背後にある場合、クエリ可能性はデータアクセスまたはビジネスロジックと見なされますか?
追加:考えれば考えるほど、2番目の質問だけが尋ねられるべきだったのかもしれません。