3

UI、BLL、DALを使用して3層アーキテクチャを構築しようとしています。リポジトリパターンでEntityFrameworkを使用しています。

私の質問は次のとおりです。EntityFrameworkによって生成されたエンティティは私のBLLの一部として機能することになっていますか、それともこれらは単なるDALオブジェクトですか?

質問する理由は、コードを複製しているように感じるからです。例:データベースから直接EntityFrameworkによって生成されたDAL.CatEntityがあります。これはすべて元気でダンディです。次に、リポジトリ(DALの一部)を使用してデータをDAL.CatEntityにプルします。次に、このDAL.CatEntityをBLLで使用し、そのデータをすべて引き出して、BLL.Catに変換します。次に、このBLL.CatをUIレイヤーで使用します。

以下は、いくつかの非常に単純化されたコードです。

BLL

public Cat GetCat(string catName){
    CatEntityRepository _repository = new CatEntityRepository;
    Cat cat = null;
    CatEntity catEntity = _repository.GetSingleCat();
    cat = ConvertToCat(catEntity);
    return cat;
}

private Cat ConvertToCat(CatEntity entity){
    return new Cat(){
        Name = entity.Name,
        Color = entity.Color,
        //....
    }
}

UI:

public ActionResult method(){
    Cat cat = BLL.GetCat();
    //......
}

CatとCatEntityの両方を持つ必要はないようです。リポジトリをDLLとして使用しながら、EntityFrameworkエンティティをBLLの一部として使用できますか?

ありがとう。

4

3 に答える 3

3

最終的に、あなたがすることはあなた次第です。ほとんどのアプリは、実用的で実用的な国で、理想と恐ろしい間のどこかにあります。

あなたがする必要があるのはあなたのアプリの複雑さを見ることです。複雑になるほど、高度な分離の恩恵を受けることができます。多くの場合、アプリの単純さは、明確なレイヤーを作成するために必要な大量の作業を正当化するものではありません。

そうは言っても、私の意見では、多数の中小規模のアプリでは、エンティティをビジネスオブジェクトとして効果的に扱うことができます。特に、エンティティをPOCOおよびビジネスレイヤーの一部にしてから、それらのエンティティをEF DALで使用すると、非常に効率的になります。

ただし、ビジネスオブジェクトまたはデータオブジェクトをUIに直接送信することには常に注意が必要です。ビジネスとUIの間で変換される専用のUIオブジェクトが必要です。

データアクセス方法を変更する可能性がある場合は、ビジネスとデータを強力に分離することが最も理にかなっていると思います。たとえば、EFを直接使用するのではなく、データを取得するためにWebサービスに変更する可能性があると思われる場合です。また、関心の分離を強力に行うことで、単体テストに大いに役立ちます。

于 2012-09-08T18:53:46.863 に答える
2

コードを複製していると思われる場合は、おそらくサービスレイヤーは必要なく、EFエンティティがビジネスモデルとして機能する可能性があります。これは、ビジネスレイヤーを必要としない単純なCRUDアプリケーションの場合によくあります。

于 2012-09-08T18:50:45.067 に答える
1

別のアプローチは、2つのタイプのオブジェクト間で変換するのではなく、ドメインエンティティからインターフェイスを作成し、インターフェイスに対してリポジトリをコーディングすることです。

このようにして、2つのケーキを同時に焼きます。データレイヤーエンティティをbllエンティティに変換せず、それでもレイヤーを混乱させていません(リポジトリが具体的なデータレイヤータイプで機能しないという意味で)。

このアプローチは驚くほど便利ですが、ほとんど説明されていません。

于 2012-09-08T19:00:19.547 に答える