まず、これは長い質問のように思えるかもしれません。そうではないと思います...コードは、私が現在行っていることの概要にすぎません。それは正しくないので、建設的な批判と落とし穴に対する警告、および私にできることの提案を探しています。
ビジネス オブジェクトを含むデータベースがあります。
親オブジェクトのプロパティにアクセスする必要があります。
ビジネス オブジェクトを通じて何らかの状態を維持する必要があります。
クラスを見ると、アクセス修飾子が正しいとは思えません。あまりうまく構成されていないと思います。リレーションシップのほとんどは、パブリック プロパティでモデル化されています。SubAccount.Account.User.ID <-- それらはすべて公開されています..
これよりもクラス間の関係をモデル化するためのより良い方法があるので、それほど「公開」されませんか?
この質問の他の部分は、リソースに関するものです。
リストを返す User.GetUserList() 関数を作成し、9000 人のユーザーがいる場合、GetUsers メソッドを呼び出すと、9000 個の User オブジェクトが作成され、その中に 9000 個の新しい AccountCollection オブジェクトが作成されます。このプロジェクトがそれほどリソースを消費しないようにするにはどうすればよいですか?
以下のコードを見つけて、細断してください。
public class User {
public string ID {get;set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public string PhoneNo {get; set;}
public AccountCollection accounts {get; set;}
public User {
accounts = new AccountCollection(this);
}
public static List<Users> GetUsers() {
return Data.GetUsers();
}
}
public AccountCollection : IEnumerable<Account> {
private User user;
public AccountCollection(User user) {
this.user = user;
}
public IEnumerable<Account> GetEnumerator() {
return Data.GetAccounts(user);
}
}
public class Account {
public User User {get; set;} //This is public so that the subaccount can access its Account's User's ID
public int ID;
public string Name;
public Account(User user) {
this.user = user;
}
}
public SubAccountCollection : IEnumerable<SubAccount> {
public Account account {get; set;}
public SubAccountCollection(Account account) {
this.account = account;
}
public IEnumerable<SubAccount> GetEnumerator() {
return Data.GetSubAccounts(account);
}
}
public class SubAccount {
public Account account {get; set;} //this is public so that my Data class can access the account, to get the account's user's ID.
public SubAccount(Account account) {
this.account = account;
}
public Report GenerateReport() {
Data.GetReport(this);
}
}
public static class Data {
public static List<Account> GetSubAccounts(Account account) {
using (var dc = new databaseDataContext()) {
List<SubAccount> query = (from a in dc.Accounts
where a.UserID == account.User.ID //this is getting the account's user's ID
select new SubAccount(account) {
ID = a.ID,
Name = a.Name,
}).ToList();
}
}
public static List<Account> GetAccounts(User user) {
using (var dc = new databaseDataContext()) {
List<Account> query = (from a in dc.Accounts
where a.UserID == User.ID //this is getting the user's ID
select new Account(user) {
ID = a.ID,
Name = a.Name,
}).ToList();
}
}
public static Report GetReport(SubAccount subAccount) {
Report report = new Report();
//database access code here
//need to get the user id of the subaccount's account for data querying.
//i've got the subaccount, but how should i get the user id.
//i would imagine something like this:
int accountID = subAccount.Account.User.ID;
//but this would require the subaccount's Account property to be public.
//i do not want this to be accessible from my other project (UI).
//reading up on internal seems to do the trick, but within my code it still feels
//public. I could restrict the property to read, and only private set.
return report;
}
public static List<User> GetUsers() {
using (var dc = new databaseDataContext()) {
var query = (from u in dc.Users
select new User {
ID = u.ID,
FirstName = u.FirstName,
LastName = u.LastName,
PhoneNo = u.PhoneNo
}).ToList();
return query;
}
}
}