2012-11-08 43 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,但这将是另一个大讨论,所以我在这里将自己缩短。