ASP.net で依存性注入を使用して、最初のデータ ドリブン ドメインの開発に取り組んでいます。
たとえば、いくつかのドメイン データ モデルを作成した場合、データ アクセス レイヤーで:
public class Company {
public Guid CompanyId { get; set; }
public string Name { get; set; }
}
public class Employee {
public Guid EmployeeId { get; set; }
public Guid CompanyId { get; set; }
public string Name { get; set; }
}
次に、次のようなインターフェイスを開発しました。
public interface ICompanyService {
IEnumerable<Model.Company> GetCompanies();
IEnumerable<Model.Employee> GetEmployees();
IEnumerable<Model.Employee> GetEmployees(Guid companyId);
}
別のモジュールで、Linq to Sql を使用してこのインターフェイスを実装しました。
public class CompanyService : ICompanyService {
public IEnumerable<Model.Employee> GetEmployees();
{
return EmployeeDb
.OrderBy(e => e.Name)
.Select(e => e.ToDomainEntity())
.AsEnumerable();
}
}
ToDomainEntity() は、基本エンティティ クラスの拡張メソッドとして従業員リポジトリ クラスに実装されます。
public Model.EmployeeToDomainEntity()
{
return new Model.Employee {
EmployeeId = this.EmployeeId,
CompanyId = this.CompanyId,
Name = this.Name
};
}
ここまでは、Mark Seeman の優れた著書「Dependency Injection in .NET」で説明されているパターンに多かれ少なかれ従ってきましたが、すべてうまく機能しています。
ただし、基本モデルを拡張して主要な参照モデルも含めるようにしたいので、ドメインの Employee クラスは次のようになります。
public class Employee {
public Guid EmployeeId { get; set; }
public Guid CompanyId { get; set; }
public Company { get; set; }
public string Name { get; set; }
}
ToDomainEntity() 関数は次のように拡張されます。
public Model.Employee ToDomainEntity()
{
return new Model.Employee {
EmployeeId = this.EmployeeId,
CompanyId = this.CompanyId,
Company = (this.Company == null) ? null : this.Company.ToDomainEntity()
Name = this.Name
};
}
これはドメイン モデリングの観点からは「悪い習慣」ではないかと思いますが、私が遭遇した問題は、同じ目的を達成するために特定のビュー モデルを開発する場合にも当てはまると思います。
本質的に、私が遭遇した問題は、データ モデルを作成する速度/効率です。上記の ToDomainEntity() アプローチを使用すると、Linq to Sql は個別の SQL 呼び出しを作成して、各従業員の Company レコードのデータを取得します。これにより、ご想像のとおり、特にデータ ツリーが複雑な場合 (各ノード/ツリーのサブノード)。
データモデルを作成すると「インライン...
public IEnumerable<Model.Employee> GetEmployees();
{
return EmployeeDb
.OrderBy(e => e.Name)
.Select(e => new Model.Employee {
EmployeeId = e.EmployeeId,
/* Other field mappings */
Company = new Model.Company {
CompanyId = e.Company.CompanyId,
/* Other field mappings */
}
}).AsEnumerable();
}
Linq to SQL は、「内部結合」メソッドをネイティブに使用して会社を従業員に関連付ける、適切でタイトな SQL ステートメントを生成します。
2 つの質問があります。
1) ドメイン クラス オブジェクト内から関連するデータ クラスを参照することは「悪い習慣」と見なされますか?
2) これが事実で、目的のために特定のビュー モデルが作成されている場合、式ツリーを構築するためにインライン割り当てブロックを作成することに頼ることなく、使用してモデルを設定する正しい方法は何ですか?
ヘルプ/アドバイスをいただければ幸いです。