1

データモデルをコントローラーに直接渡すのではなく、代わりにビューモデルを使用するように、MVC 3 Web アプリのリファクタリングに取り組んでいます (ここでインスピレーションを参照してください)。

現在、モデルのリストを作成するとき、コントローラーで次の行に沿って何かを行います。

var myQuery = from t in _db.TimeEntries
select t;

List<TimeEntry> timeEntryList = myQuery.ToList<TimeEntry>();

TimeEntries はデータベースにバインドされています。

しかし、今、私はこれを持つビューモデルを持っています:

public class TimeEntryViewModel
    {

        public TimeEntry entry {get; set;}
        public Time time { get; private set; }

        public TimeEntryViewModel();
        public TimeEntryViewModel(int ID)
        {
            PraxisTime.Models.PraxisTimeDB _db = new PraxisTime.Models.PraxisTimeDB();
            entry = _db.TimeEntries.Find(ID);

            time = _db.Times.Find(entry.TimeID);
        }
    }

これらのリストを作成するまでは、これで問題ありません。これがビューモデルに追加された私のソリューションですが、ぎこちなく感じます。

public static List<TimeEntryViewModel> LoadTimeEntryViewModels(string userID)
        {
            theDB _db = new theDB();
            List<int> myQuery = (from t in _db.TimeEntries
                                 select t.ID).ToList<int>();

            List<TimeEntryViewModel> timeEntryList = new List<TimeEntryViewModel>();

            foreach (int i in myQuery)
            {
                timeEntryList.Add(new TimeEntryViewModel(i));
            }
            return timeEntryList;
        }

私が行方不明になっているより良い方法はありますか?

4

1 に答える 1

1

データをプルしてそれ自体にデータを入力する方法を知ることは、ビューモデルの責任ではありません。基本的には、ビューの少し余分なメタデータ(必要なものなど)を持つdtoです。最初に、コントローラーにデータベースへの呼び出しを行わせます。その後、アプリの成長に合わせて、db 呼び出しをリポジトリ/データ アクセス レイヤーにリファクタリングできます。

また、次のようにして linq クエリをクリーンアップすることもできます。

var entries = from t in _db.TimeEntries
              select new TimeEntryViewModel { entry = t.entry, time = t.time };

また、TimeEntry は db エンティティですか? もしそうなら、あなたはビューモデルでそれを参照しています。また、データベースを新しくしています。何らかの依存性注入を使用してコードを分離し、コードをクリーンアップするだけでなく、単体テストでモックする機能を提供し、後でセットアップします。具象の代わりに依存関係のインターフェースを渡すことができます。

于 2013-04-09T03:00:49.927 に答える