5

3 層のアプリケーションがあります

DALには、EF6がデータベースから自動的に生成したEDMXファイルがあります(DB Firstモード)。私もBLLとULレイヤーを持っています。

ただし、UI で BLL メソッドを使用する場合は、DAL アセンブリを UI レイヤーに追加する必要があります (メソッドの戻り値の型のため)。

List<Person> 

Person define in EDMX (DAL)] (これは私の問題です)

クラス (DTO) を EDMX ファイルから分離し、別のアセンブリとして作成するにはどうすればよいですか?

DAL アセンブリ (EDMX 全体) を UI レイヤーに追加しないようにするにはどうすればよいですか?

4

3 に答える 3

3

これが私がすることです。DAL を UI から切り離すには、「中間層」が必要です。次の図を考えてみましょう。

ここに画像の説明を入力

中間層は、サービス層またはアプリケーション層として広く知られています。

Personデータがあるレイヤーから別のレイヤーに渡されるたびに、その特定のレイヤーの同等のクラスに「マップ」されます。

次のスニペットは、サービス層の非常に基本的な例を構成しています。AutoMappers やその他の一般的なプラクティスなど、その他の詳細は含めませんでした。

PersonDto、中間層で定義され、Personエンティティを表します。

public class PersonDto
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

PersonServiceクラスデータ アクセスとビジネス ロジックをカプセル化し、PersonDto(エンティティではなく) のみを返します。これは、UI がドメインと通信する方法です。

public class PersonService
{
    public PersonDto GetPersonById(int id)
    {
         Person person = dbContext.Persons.Find(id);
         
         // Mapping in action.
         var personDto = new PersonDto()
         {
             FirstName = person.FirstName,
             LastName = person.LastName,
         };

         return personDto;
    }
}

これPersonServiceは UI コードが認識しているものであり、データ アクセスやビジネス ロジックについては認識していません。サービスについてのみ知っています。

サービスはビジネス ロジックをカプセル化し、UI を BLL および DAL から分離する必要があります。

于 2014-05-18T04:58:30.457 に答える
1

良い質問です。層/レイヤー (DAL、BLL、および UI) ごとに異なる Person を定義し、各レイヤー間をマップするコードを記述するというのが一般的な知恵です。生活を楽にするAutoMapperがあります。

ここで、100 から 1,000 のエンティティを持つ実際のアプリケーションを考えてみましょう。このパターンはうまくスケーリングしません。

EF に対してCode Firstアプローチを使用することをお勧めします。そして、すべてのレイヤー間で同じオブジェクトを渡します。

于 2014-05-17T12:09:26.847 に答える