0

私はかなり大きなプログラムに追加しています。このプログラムには、各従業員のすべての属性を含むデータベースからマップされたクラスがあります。名前、電話番号、採用日など、さまざまな情報が含まれています。全部で40以上の属性。

さて、個人的なニーズのために、このデータにアクセスする必要がありますが、使用できる属性のすべてではなく、4つまたは5つの属性を使用するだけで済みます。この「ミニオブジェクト」は、検索、結果の返送など、さまざまな方法で操作します。これは私の説明を補足するための小さな作り上げの例です。

public class BigEmployee //mapped from database
{
    public string attr1 {get;set;}
    public string attr2 {get;set;}
    public string attr3 {get;set;}
    public string attr4 {get;set;}
    //...etc, until attribute 40
}

public class SmallEmployee //IF THIS EXISTED, this all that I would need
{
    public string attr1 {get;set;} //same as BigEmployee attr1
    public string attr2 {get;set;} //same as BigEmployee attr2
    public string attr3 {get;set;} //same as BigEmployee attr3
}

およびメソッドの例:

public List<SmallEmployee> GetAllEmployees
{
    return EmployeeList;
}

それで、私が疑問に思っているのは、この問題にどのように取り組むのですか?メインクラスからプルされた別のオブジェクトを作成する必要がありますか?毎回メインクラスにアクセスして、特定の属性のみを返すように強制する必要がありますか?

4

3 に答える 3

5

あなたが提供した情報からあなたの質問に簡単に答えることはできません。ただし、一般的なガイダンスを提供しようと思います。

多くのサードパーティORM(Entity Framework、NHibernate、SimpleDataなど)の1つであろうと、自家製のものであろうと、プロジェクトは何らかの形式のORMを使用しているようです。その場合は、同じエンティティの「ライト」バージョンを独自のクラスに作成するだけで、実質的に問題はありません。ORMで生成されたクラス、DTO(データ転送オブジェクト)である必要があるため、クラス内にビジネスロジックが含まれていてはなりません。このようなクラスを使用する利点は、ORMによっては、データベーストラフィックを削減できることです(使用する列のみを戻すため)。

しかし(そしてこれは大きいですが)

これらは読み取り専用の使用にのみ適しています

ほとんどのORMは、オブジェクト全体またはオブジェクトグラフをデータベースに保存することに依存しています。これらは通常、元のオブジェクトを完全なORM互換エンティティ形式でメモリに保存せずにデータベースに変更を加える手段を提供しません。これらの「ライト」クラスの最も一般的な使用法は、オブジェクトの大きなリストをユーザーに送り返すことです。その時点で、ユーザーはプログラムに慣用的な方法で1つを選択し、プログラムは編集のために完全なエンティティオブジェクトを取得します。 。

必要なのが完全な双方向サポート(挿入、更新、および削除機能と一緒の取得)である場合、実質的には完全なエンティティクラスの使用に制限されます。

編集これは「ライト」エンティティの使用例です。

コンテキストで名前が付けられたエンティティがあるとCustomerします。intID(an )と名前(a )のみを含むライトカスタマーが必要stringです。ライトエンティティのクラスを定義するだけです。

public class CustomerLite
{
    public int CustomerId { get; set; }
    public string Name { get; set; }
}

次に、次のようなクエリで使用します。

var liteCustomers = context.Customers
                    .Where(c => c.Name.StartsWith("Smith, ")
                    .Select(c => new CustomerLite()
                    {
                        CustomerId = c.CustomerId,
                        Name = c.Name
                    })
                    .ToList();

(または、ラムダ構文よりもクエリ構文を使用する場合)

var liteCustomers = (from c in context.Customers
                     where c.Name.StartsWith("Smith, ")
                     select new CustomerLite()
                     {
                         CustomerId = c.CustomerId,
                         Name = c.Name
                     }).ToList();
于 2013-03-25T19:22:14.357 に答える
2

はい、それはそれを行うための良い方法です。これは、データベースから直接クエリとして返したい場合に使用する方法です。

別の方法は、インターフェースを使用することです。

public interface ISmallEmployee
{
    string attr1 {get;set;} //same as BigEmployee attr1
    string attr2 {get;set;} //same as BigEmployee attr2
    string attr3 {get;set;} //same as BigEmployee attr3
}

public class BigEmployee : ISmallEmployee
{
    ...
}

ただし、ORMはおそらくこれを直接認識しないため、すべてのをクエリしてC#でBigEmployeeキャストする必要があります。ISmallEmployee

SmallEmployeeの基本クラスを作成することもできBigEmployeeます。これを相互に実行するようにORMを構成する方法に少し注意する必要があります。

于 2013-03-25T19:18:24.583 に答える
0

あなたは正しい方向に進んでいると思います。

SOLIDhttp ://www.codeproject.com/Articles/60845/The-SOLID-Object-Oriented-Programming-OOP-PrinでIを検索します

この場合、クライアントが必要とする投影にメインオブジェクトをマッピングします。

于 2013-03-25T19:24:05.910 に答える