これを行うための最もクリーンな方法を見つけようとしています。
現在、私は顧客オブジェクトを持っています:
public class Customer
{
public int Id {get;set;}
public string name {get;set;}
public List<Email> emailCollection {get;set}
public Customer(int id)
{
this.emailCollection = getEmails(id);
}
}
次に、私の Email オブジェクトもかなり基本的なものです。
public class Email
{
private int index;
public string emailAddress{get;set;}
public int emailType{get;set;}
public Email(...){...}
public static List<Email> getEmails(int id)
{
return DataAccessLayer.getCustomerEmailsByID(id);
}
}
DataAccessLayer は現在データベースに接続しており、SqlDataReader を使用して結果セットを反復処理し、新しい Email オブジェクトを作成して、完了時に返される List に追加します。
では、これをどこでどのように改善できますか?
代わりに DataAccessLayer に DataTable を返させ、それを Email オブジェクトに任せて解析し、List を顧客に返す必要がありますか?
「Factory」はおそらく間違った言葉だと思いますが、DataAccessLayer から DataTable を取得し、リストを Email オブジェクトに返す別のタイプの EmailFactory を使用する必要がありますか? 私はそのようなことは冗長に聞こえると思います...
私の Email.getEmails(id) を静的メソッドとして使用することは、これでも適切な方法ですか?
通常は単純なタスクに最適な「パターン」を見つけて適用しようとすることで、私は自分自身を捨てているだけかもしれません.
ありがとう。
ファローアップ
ドメイン/ビジネス オブジェクトが既存のデータベースから ID で顧客レコードを抽出する実際の例を作成しました。nhibernate の xml マッピング ファイルは非常に優れています。チュートリアルに従ってセッションとリポジトリ ファクトリをセットアップした後は、データベース レコードのプルは非常に簡単でした。
ただし、パフォーマンスが大幅に低下していることに気付きました。
私の元のメソッドは、結果セットをドメイン/ビジネス オブジェクトに解析する DAL オブジェクトによって呼び出される DB 上のストアド プロシージャで構成されていました。
1 つの顧客レコードを取得するのに 30 ミリ秒かかる元の方法を記録しました。次に、同じレコードを取得するのに 3000 ミリ秒かかる nhibernate メソッドのクロックを記録しました。
何か不足していますか?それとも、この nhibernate ルートを使用すると、多くのオーバーヘッドが発生しますか?
それ以外の場合は、コードのクリーンさが気に入っています。
protected void Page_Load(object sender, EventArgs e)
{
ICustomerRepository repository = new CustomerRepository();
Customer customer = repository.GetById(id);
}
public class CustomerRepository : ICustomerRepository
{
public Customer GetById(string Id)
{
using (ISession session = NHibernateHelper.OpenSession())
{
Customer customer = session
.CreateCriteria(typeof(Customer))
.Add(Restrictions.Eq("ID", Id))
.UniqueResult<Customer>();
return customer;
}
}
}
私が従った例では、セッションを管理するのに役立つヘルパー クラスを作成しました。
public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
Configuration cfg = new Configuration();
cfg.Configure();
cfg.AddAssembly(typeof(Customer).Assembly);
_sessionFactory = cfg.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
私が取り組んでいるアプリケーションでは、速度が重要です。そして最終的には、Web アプリとデータベースの間で大量のデータがやり取りされます。エージェントが顧客レコードを取得するのに 3 秒ではなく 1/3 秒かかる場合、それは大ヒットです。しかし、私が奇妙なことをしていて、これが 1 回限りの初期セットアップ コストである場合、パフォーマンスが DB でストアド プロシージャを実行するのと同じくらい優れていれば、それだけの価値があるかもしれません。
まだ提案を受け付けています!
更新しました。
ORM/NHibernate ルートを廃棄しています。パフォーマンスが遅すぎて、使用を正当化できないことがわかりました。基本的な顧客クエリは、私たちの環境では時間がかかりすぎます。1 秒未満の応答に比べて 3 秒は多すぎます。
遅いクエリが必要な場合は、現在の実装を維持します。それを書き直すという考えは、時間を大幅に増やすことでした。
しかし、先週 NHibernate で遊んだ後では、それは素晴らしいツールです! このプロジェクトの私のニーズにはまったく合いません。