大規模な ASP.NET MVC アプリケーションのビジネス レイヤーとデータ レイヤーを作成しようとしています。この規模のプロジェクトを試みるのはこれが初めてなので、本を何冊か読んで、物事を適切に分離することに細心の注意を払っています。通常、私のアプリケーションではビジネス ロジックとデータ アクセス レイヤーが混在し、複数のビジネス エンティティが 1 つのクラス内で絡み合っています (追加する場所を見つけようとしているときに、何度か混乱しました)。
私が読んできた内容のほとんどは、ビジネス レイヤーとデータ レイヤーを分離することです。これはすべて問題ないように思えますが、いくつかのシナリオでこれを行う方法を正確に視覚化するのに苦労しています. たとえば、管理者が新しい製品をシステムに追加できるようにするシステムを作成しているとします。
public class Product
{
public int Id { get; private set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
次に、リポジトリを作成してデータ アクセスを分離します。
public class ProductRepository
{
public bool Add(Product product);
}
製品の名前に少なくとも 4 文字を要求したいとしましょう。これをきれいに行う方法がわかりません。
私が持っていた 1 つのアイデアは、Name の set プロパティを拡張し、4 文字の長さの場合にのみ設定することでした。ただし、 Product.Name != 渡されたものを除いて、製品を作成しているメソッドが名前が設定されなかったことを知る方法はありません。
私が持っていた別のアイデアは、それをリポジトリの Add() メソッドに入れることですが、その後、ビジネス ロジックとデータ ロジックがすぐそこにあります。つまり、Add 呼び出しが失敗した場合、ビジネス ロジックまたは DAL が失敗したためです (また、モック フレームワークを使用してテストできないことも意味します)。
私が考えることができる唯一のことは、レポジトリの Add() メソッドから呼び出される第 3 層に私の DAL を配置することですが、私の本やweb (少なくとも私は見たことがある)。また、それが必要かどうか確信が持てない場合、ドメイン モデルの複雑さが増します。
もう 1 つの例は、名前が 1 つの製品だけで使用されるようにすることです。これは、Product クラス、ProductRepository の Add() メソッド、またはどこに入れますか?
補足として、私は ORM として NHibernate を使用する予定ですが、(理論的には) 必要なことを達成するために、TDD はすべてを分離できるはずなので、使用している ORM は問題ではありません。
前もって感謝します!