0

私は MVC の初心者で、オンライン バンキングの機能の一部をシミュレートする基本的な Web アプリケーションを構築しようとしています。これまでのところ、ユーザー アカウントをセットアップして SimpleMembership にリンクし、アカウント管理用の簡単な CRUD 機能を実装することができました。

編集:

以下のように送金を行い、ユーザーにビューのドロップダウン ボックスから account1 と account2 を選択させ、送金金額を入力させます。私の質問は、両方のアカウントの合計が同じクラスにある以下の特定のモデル設定で、このようなことを行うことはできますか? それとも、各生徒にアカウントの ICollection を与えるのが最善でしょうか?

また、転送のロジックとアクション結果をこのように処理するのは正しい方法ですか? それとも、モデルでそれを処理するのが最善ですか?

私がやろうとしていることの疑似コード

    public ActionResult TransferFunds(int firstAccountId, Int SecondAccountID, decimal transferAmount)
{
    var account1 = //find first account from context
    var account2 = //find second account from context

    if(account1 amount >= transferAmount)
    {
        account1 amount -= transferAmount;
        account2 amount += transferAmount;
    }
    save changes
}

これをご覧いただき、ご協力いただきありがとうございます。

私が参照した関連モデルは次のとおりです。

ユーザー、学生、およびアカウントのモデル

    public class User
{
    [Key]
    [Editable(false)]
    [ForeignKey("UserProfile")]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
    public int UserId { get; set; }

    public virtual UserProfile UserProfile { get; set; }

    [Display(Name = "First Name")]
    [Required(ErrorMessage = "First name is required.")]
    [MaxLength(50)]
    public virtual string FirstName { get; set; }

    [Display(Name = "Last Name")]
    [Required(ErrorMessage = "Last name is required.")]
    [MaxLength(50)]
    public virtual string LastName { get; set; }
}

学生

    public class Student : User
{
    [ForeignKey("Account")]
    [Editable(false)]
    public virtual int AccountID { get; set; }

    public virtual Account Account { get; set; }

    [Column("ClassroomID")]
    [ForeignKey("Classroom")]
    public virtual int ClassroomID { get; set; }

    public virtual Classroom Classroom { get; set; }
}

銀行口座

    public class Account
{
    [Key]
    [Editable(false)]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
    public virtual int AccountID { get; set; }

    [DisplayFormat(DataFormatString = "{0:c}")]
    [Column(TypeName = "money")]
    public virtual decimal CheckingsTotal { get; set; }

    [DisplayFormat(DataFormatString = "{0:c}")]
    [Column(TypeName = "money")]
    public virtual decimal SavingsTotal { get; set; }

    public decimal AccountTotal()
    {
        return SavingsTotal + CheckingsTotal;
    }
4

1 に答える 1

1

あなたの質問は実際には MVC や EF に関するものではなく、むしろクラス設計とドメイン モデリングに関するものであるように私には思えます。これは非常に幅広いテーマであるため、誰にとっても適切な回答は難しいでしょう。このテーマについて読んでみる価値は十分にあります。

ただし、ここにいくつかの指針があります。

上で与えられた大まかな設計は「うまくいく」かもしれませんが、いくつかの問題があります。

たとえば、ユーザーが「当座預金」口座と「普通預金」口座以上のものを必要としていると判断した場合は、Accountクラスと基礎となるデータベースを変更する必要があります。あなたが提案するように、ユーザーが Accounts の ICollection を持っている方が良いでしょう。

一般的に言えば、そのようなロジックをコントローラーに含めることはお勧めできません。コントローラーのアクションには、多くのロジックを含める必要はありません。この種のロジックはモデルの基本であるため、ここに配置する必要があります。コントローラーの小さな間違いが、ある口座にお金を入れて、別の口座からお金を引き出さないということを意味するのはあまりにも簡単です.

また、ある口座から別の口座に送金することは、ある口座から差し引いて別の口座に追加するという単純なものではないことも考慮してください。最初の口座に十分なお金がない場合はどうなるでしょうか? 2 番目のアカウントが最初のアカウントと同じユーザーによって所有されていない場合はどうなりますか? 後で、入金はで​​きるが引き出しはできない口座があると判断した場合はどうなりますか? などなど

送金に関するロジックは非常に複雑になる可能性があり、コントローラー全体に散らかしたくない場合があります。これらすべてを 1 つの場所、つまりモデルに配置するのが最善です。

AccountManagerこの種のことを担当する

例えば

public class AccountManager
{

    public void TransferMoney(Account srcAccount, Account destAccount, Decimal amount) 
    {
       //...transfer money...
    }

}

コントローラーにこのメソッドを呼び出して、転送を手配します。

読んで、デザインを思いつき、試してみることが最善です。思いついたデザインについて気に入らない、または確信が持てないことがある場合は、具体的な質問を StackOverflow に投稿してください。誰かが助けてくれると確信しています。大まかな一般的な質問は、非常に役立つ回答を得る可能性が低くなります。

于 2013-06-25T04:10:41.800 に答える