2012-11-08 47 views
0

我試圖找出最好的方法來做這個代碼 (因爲我認爲,我的方式鎖不好): 我試圖讓它容易理解問題。用不同的存儲庫填充ViewModel的最佳實踐

public ActionResult Index() 
{ 
var user=new User(); 
user.load(1); 
return View(user); 
} 

load(int id) 
{ 
//pseudocode: 
//1. load user from repository1  
//2. load address from repository2 
//3.load payments from repository3 
} 
+0

你現在這樣做的方式有什麼問題? – Suhas

+0

ViewModel包含DB代碼/邏輯代碼。通常,ViewModel不應該包含邏輯代碼。我經常閱讀這個。 – boqus

+0

那是我正在尋找的答案。在那種情況下,只需將代碼重構爲它自己的類。我通常將這些類命名爲模型服務。所以在你的情況下,它會是'UserModelService'。並將'UserModelService'作爲依賴項注入到您的控制器中 – Suhas

回答

0

在這裏你去

我們將首先創建一個UserModelService如下

public class UserModelService 
{ 
    public User Load(int id) 
    { 
     var userRepository = new UserRepository(); 
     var user = userRepository.Load(id); 

     var addressRepository = new AddressRepository(); 
     user.Address = addressRepository.LoadForUserId(id); 
     return user; 
    } 
} 

我們會再修改控制器的原代碼如下

public ActionResult Index() 
{ 
    var userModelSerice =new UserModelService(); 
    var user = userModelService.load(1); 
    return View(user); 
} 

所有剩餘以上代碼參考如下

public class AddressRepository 
{ 
    public Address LoadForUserId(int id) 
    { 
     // Load the address for given user id 
    } 
} 

public class UserRepository 
{ 
    public User Load(int id) 
    { 
     // Load and return user 
    } 
} 

public class User 
{ 
    public Address Address { get; set; } 
} 

public class Address 
{ 
} 

現在在您的控制器操作中,不是創建一個新實例UserModelService,而是通過構造函數注入它。類似的原理可以用於將庫存入UserModelService,但這將是另一個大討論,所以我在這裏將自己縮短。