我正在将我的服务注入到我的控制器中。我应该将我的服务注入到我的 ViewModel 中吗?
因此,我一直在构建一个全新的网站来取代我们当前的经典 asp 网站。我建立了一个基础项目,并添加了我将使用的所有不同技术。
忍者 自动映射器 分页列表 EF 4.0
到目前为止,我已经有了该网站的工作原型。它从数据库中提取数据,并显示在我的页面上。我认为我没有正确遵循模式。因为我的控制器动作看起来很奇怪。我开始认为我需要更改注入以将服务注入到视图模型中?将服务插入 ViewModel 是否很常见?
视图模型
public class ParcelDetailViewModel
{
public Property Property { get; set; }
public int CurrentYear { get; set; }
public IEnumerable<AltOwnership> AltOwnership { get; set; }
public Ownership Ownership { get; set; }
public TotalValues TotalValues { get; set; }
public SiteAddressViewModel SiteAddress { get; set; }
public Value CurrentValues { get; set; }
public Transfer LatestTransfer { get; set; }
public LegalDescription LegalDescription { get; set; }
}
控制器
public class PropertyController : Controller
{
ICamaService _service = null;
[Inject]
public PropertyController(ICamaService service)
{
_service = service;
}
//TODO: ADD ACTIONS
public ViewResult List(int? page, int? size = 100)
{
var result = _service.GetProperties(page,size);
IList<ParcelDetailViewModel> ViewModel;
ViewModel = new List<ParcelDetailViewModel>();
Mapper.Map<IEnumerable<Models.Property>, IEnumerable<ParcelDetailViewModel>>(result, ViewModel);
return View(ViewModel.ToPagedList(page ?? 1, size ?? 100));
}
public ViewResult Details(string id)
{
var property = _service.GetProperty(id);
var acct = property.AccountNumber;
var AltOwners = _service.GetAltOwners(id);
var LegalDescription = _service.GetLegalDescription(id);
var Legals = _service.GetLegals(id).FirstOrDefault();
var Ownership = _service.GetOwnership((decimal)property.OwnerLookup);
var Values = _service.GetValues(acct);
var TotalValues = _service.GetTotalValues(acct);
var Location = _service.GetLocation(property.LocationLookup);
ParcelDetailViewModel ViewModel = new ParcelDetailViewModel();
SiteAddressViewModel SitusAddress = new SiteAddressViewModel();
ViewModel.SiteAddress = SitusAddress;
Mapper.Map<Models.Property, ParcelDetailViewModel>(property, ViewModel);
Mapper.Map<IEnumerable<AltOwnership>, ParcelDetailViewModel>(AltOwners, ViewModel);
Mapper.Map<Ownership, ParcelDetailViewModel>(Ownership, ViewModel);
Mapper.Map<TotalValues, ParcelDetailViewModel>(TotalValues, ViewModel);
Mapper.Map(Location, SitusAddress);
Mapper.Map(property, SitusAddress);
return View(ViewModel);
}
So, I've been building a brand new website to replace our current classic asp site. I set up a base project and added in all the different technologies I would be using.
Ninject
Automapper
PagedList
EF 4.0
So far I have a working prototype of the website. It pulls data from the database, and displays in on my page. I think I am not following a pattern correctly. Because my controller action looks strange. I'm beginning to think I need to change my injection to inject my service into my viewmodel? Is it common to insert a service into a ViewModel?
ViewModel
public class ParcelDetailViewModel
{
public Property Property { get; set; }
public int CurrentYear { get; set; }
public IEnumerable<AltOwnership> AltOwnership { get; set; }
public Ownership Ownership { get; set; }
public TotalValues TotalValues { get; set; }
public SiteAddressViewModel SiteAddress { get; set; }
public Value CurrentValues { get; set; }
public Transfer LatestTransfer { get; set; }
public LegalDescription LegalDescription { get; set; }
}
Controller
public class PropertyController : Controller
{
ICamaService _service = null;
[Inject]
public PropertyController(ICamaService service)
{
_service = service;
}
//TODO: ADD ACTIONS
public ViewResult List(int? page, int? size = 100)
{
var result = _service.GetProperties(page,size);
IList<ParcelDetailViewModel> ViewModel;
ViewModel = new List<ParcelDetailViewModel>();
Mapper.Map<IEnumerable<Models.Property>, IEnumerable<ParcelDetailViewModel>>(result, ViewModel);
return View(ViewModel.ToPagedList(page ?? 1, size ?? 100));
}
public ViewResult Details(string id)
{
var property = _service.GetProperty(id);
var acct = property.AccountNumber;
var AltOwners = _service.GetAltOwners(id);
var LegalDescription = _service.GetLegalDescription(id);
var Legals = _service.GetLegals(id).FirstOrDefault();
var Ownership = _service.GetOwnership((decimal)property.OwnerLookup);
var Values = _service.GetValues(acct);
var TotalValues = _service.GetTotalValues(acct);
var Location = _service.GetLocation(property.LocationLookup);
ParcelDetailViewModel ViewModel = new ParcelDetailViewModel();
SiteAddressViewModel SitusAddress = new SiteAddressViewModel();
ViewModel.SiteAddress = SitusAddress;
Mapper.Map<Models.Property, ParcelDetailViewModel>(property, ViewModel);
Mapper.Map<IEnumerable<AltOwnership>, ParcelDetailViewModel>(AltOwners, ViewModel);
Mapper.Map<Ownership, ParcelDetailViewModel>(Ownership, ViewModel);
Mapper.Map<TotalValues, ParcelDetailViewModel>(TotalValues, ViewModel);
Mapper.Map(Location, SitusAddress);
Mapper.Map(property, SitusAddress);
return View(ViewModel);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
将服务注入控制器是完全正确的。
另一方面,将任何服务注入视图模型将违背视图模型的理念——保存数据但不执行任何操作的类。您将如何处理视图模型中的服务?
Injecting services into controllers is perfectly correct.
On the other hand, injecting any services into view models would be against the idea of view models - classes which hold data and no actions. What would you do with a service inside a view model?