現在、Repository/UnitOfWorkパターンがダウンしています。しかし、どうすれば取り除くことができるのか理解できないハードカップリングが1つあります。
これは私のパターンの概要です:
ビジネスロジック層
- IRepository
- タイプ制約として使用
- IRepository <TModel、TDTO>
- IRepositoryを実装します
- 一般的なCRUDメソッド
- IEmployeeRepository <TModel>
- IRepository <TModel、EmployeeDTO>を実装します
- 一部の従業員固有の方法
- IUnitOfWork
- リポジトリのゲッター
- 保存方法
- IEntityWithId
- DTOとEFPOCOにIDと呼ばれるInt32フィールドを強制(および公開)するためのインターフェイス
- タイプ制約として使用
- EmployeeDTO(実装されたEmployeeRepositoryでAutoMapperとマッピングされます)
- コアプロジェクトおよび(今後の)テストプロジェクトで使用されるDTOエンティティ
データレイヤー(Ninjectで注入)
- UnitOfWork
- EntityFrameworkに基づくIUnitOfWorkの実装
- EmployeesRepository
- IEmployeeRepositoryの実装<TModel>
- 従業員
- EF POCO
芯
- EmployeesController
- パラメーター化されたコンストラクターEmployeesController(IUnitOfWork unitOfWork)
- IUnitOfWorkは、(データレイヤーからの)UnitOfWorkとしてNinjectモジュールで注入されます
これらは、私の汎用IRepositoryインターフェースの問題メソッドです。
TDTO Find(Expression<Func<TModel, bool>> filter);
と
IEnumerable<TDTO> FindAll(Expression<Func<TModel, bool>> filter);
ご覧のとおり、そこにはTModelがあり、結果をフィルタリングするための式を作成するために使用されます。DTOで式を使用するようなこともできますが、DTOにマップされた従業員の完全なリストが必要になります(SQLフィルターは生成されませんが、SELECT * FROM Employee結果リストはフィルター処理されます)。したがって、これは適切なオプションではありません。
もう1つの、より実行可能であるが最適ではないソリューションは、動的LINQを使用することです。そうすれば、Find / FindAllメソッドで単純な文字列を渡して、TModel要件を取り除くことができます。ただし、これは、コードがマジックストリングで埋められるため、リファクタリングが煩わしいことを意味します。