書き方のクラスを返すメソッドで回収のインスタンス
-
05-09-2019 - |
質問
どうしたらいいのかと悩んのクラスを定義するための方法populatesとのcollectionを返しまう場合がございます。の問題がわからないのに周りにあるのは個人の属性を移植.
プログラムを利用しましょう、例本のクラスです。私たいと思っているコードに直接セット(い)によります。したいコードについて精算方法本のインスタンス.しておりますのでようなもの:
public class Book
{
private int ID;
private bool pAvailableForCheckout;
public string Title { get; set; }
public bool AvailableForCheckout { get { return pAvailableForCheckout } }
// instance methods
public Book(int BookID)
{
// Load book from DB by ID
}
public CheckOut()
{
// perform everything involved with checking a book out
}
// .. other methods like saving a book, checking out books etc.
// class method
public static List<Book> FindAll()
{
// load Dataset of books
// foreach record in DB, use the Book(int BookID) constructor and add to List
// return list of books
}
}
そこで、できるこの私のコード:
foreach(Book curBook in Book.FindAll())
{ /* do something with book */ }
この問題の実施は今まで使っていたN+1ヒットのデータベースを負荷すべての書籍だけでなく1を返します。の行き方を教えてください頃か。
私はこのプロ101がもらえますが、僕の願いしております。
解決
あなたは直接プライベートプロパティを移入protectedコンストラクタを作成することができます。
他のヒント
foreachのは、すでにインスタンス化されたオブジェクトのリストを反復処理しなければならない、彼らはDBに接続する必要はありません。
あなたは、既存のデータセットではなく、DBへの新たなヒットから本をインスタンス化することができるようにあなたの本のオブジェクトのプロパティを受け取るコンストラクタを作成する必要があります。
これます:
コンストラクタます:
public book (String title, String avail) {Title=title...}
そして方法で
public static void FindAll()
{
List<Books> books = new List<books>();
using (Sqlconnection conn = new sqlconnection(connstring))
using (sqlcommand cmd = new SqlCommand("select title, available from book ", conn)
{
SqlDatareader dr = cmd.executereader()
while (dr.read())
{
books.add(new Book(dr["title"], dr["avail"])
}
}
foreach(Book curBook in Book.FindAll())
{ /* do something with book */ }
}
例やや極端に、そのイデオロギーの純度
まず、インターフェースのためのクラスを取得することができ物のシリコーンコーティング処理をデータベースからそのID:
interface IAdapter<T>
{
T Retrieve(int id);
}
現在は、 Book
クラスは、不公開publicコンストラクタで静的な方法の採用により IAdapter<Book>
を取得する書籍からデータベース:
public class Book
{
public static IAdapter<Book> Adapter { get; set; }
public static Book Create(int id)
{
return Adapter.Retrieve(id);
}
// constructor is internal so that the Adapter can create Book objects
internal Book() { }
public int ID { get; internal set; }
public string Title { get; internal set; }
public bool AvailableForCheckout { get; internal set; }
}
のが好きなのを実装するクラス IAdapter<Book>
自分に割り当て Book.Adapter
へのインスタンスのように Book.Create()
き抜かないことをデータベースです。
そのイデオロギーの純度の"このデザインを実施すね剛性の分離に関するあの Book
クラスを知っている方のお話をうかがデータベースもあ は データベース化します。
例えば、一つの実施 IAdapter<Book>
:
public class DataTableBookAdapter : IAdapter<Book>
{
public DataTable Table { get; set; }
private List<Book> Books = new List<Book>();
Book Retrieve(int id)
{
Book b = Books.Where(x => x.ID = id).FirstOrDefault();
if (b != null)
{
return b;
}
BookRow r = Table.Find(id);
b = new Book();
b.ID = r.Field<int>("ID");
b.Title = r.Field<string>("Title");
b.AvailableForCheckout = r.Field<bool>("AvailableForCheckout");
return b;
}
}
その他のクラスは、責任をpopulatingの DataTable
このクラスです。きく異なる実装を使用した SqlConnection
話のデータベース。
もできるので書きます:
public IAdapter<Book> TestBookAdapter : IAdapter<Book>
{
private List<Book> Books = new List<Book>();
public TestBookAdapter()
{
Books.Add(new Book { ID=1, Title="Test data", AvailableForCheckout=false };
Books.Add(new Book { ID=2, Title="Test data", AvailableForCheckout=true };
}
Book Retrieve(int id)
{
return Books.Where(x => x.ID == id);
}
}
この実装を使用しませんのでデータベースまで使える場合、この文書のユニットテストの Book
クラスです。
この両方のこれらのクラスを維持し、民間 List<Book>
物件です。この保証は毎回呼び出す Book.Create()
指定されたIDが返されますが、同じ Book
インスタンス.が議論されることについての特徴 Book
クラスはいく静的な民間 List<Book>
財産 Book
と書くのが、"ロジカル(論理的)であるの Create
方法それを維持しましょう。
お使いいただいた同一のためのアプローチを押してデータをデータベースを追加 Update
, Delete
, は、 Insert
方法 IAdapter<T>
し、実行するにはアダプターの授業は、 Book
通の方法での適切な時間。
なぜあなたはSQL文のどこ?
を使用してデータベース側で本の可用性をチェックしません。