【问题标题】:I'm injecting my Service into my controller. Should I inject my Service into my ViewModel instead?我将我的服务注入我的控制器。我应该将我的服务注入到我的 ViewModel 中吗?
【发布时间】:2012-02-24 04:25:48
【问题描述】:

所以,我一直在建立一个全新的网站来取代我们当前的经典 asp 网站。我建立了一个基础项目并添加了我将使用的所有不同技术。

忍者 自动映射器 分页列表 英孚 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);
    }

【问题讨论】:

  • 你使用的是什么模式? ViewModel 是 MVVM,Controler 是来自 MVC?所以你同时使用吗?
  • 嗯。也许这是我的问题的一部分。我的模型与我的观点如此不同,我需要一些东西将两者拉近。我见过其他使用 viewModel 的 Web 应用程序。
  • 这是一个使用控制器和 ViewModel 的示例。我认为。 nerddinnerbook.s3.amazonaws.com/Part6.htm
  • 控制器和视图模型在一起并不罕见。服务器使用的是 MVC,但 M 实际上是一个 VM,因为在数据库或域层中还有另一个 M。
  • @Domenic 谢谢你的澄清。这是我的理解。

标签: c# asp.net-mvc-3 inversion-of-control design-patterns


【解决方案1】:

将服务注入控制器是完全正确的。

另一方面,将任何服务注入到视图模型中将违背视图模型的理念——类包含数据但没有操作。您会如何处理视图模型中的服务?

【讨论】:

  • 数据库模型与数据需要在视图上显示的方式相去甚远。一些属性来自多个表中的 3 或 4 个字段,它们成为视图上的 1 个字段。
  • 没错。它仍然是负责创建此类模型的控制器。
  • 所以在我的控制器中,我可以(例如)有一行从两个不同的服务填充我的 ViewModel 中的属性,ViewModel.Name = _service.FirstName + _service2.LastName
  • 如果 ViewModel 数据的构造很重要,您可能希望将逻辑提取到控制器可以委托给它自己的类中,但您仍然不会将其放入 ViewModel 本身。
  • @sil。我们正在谈论MVC。 MVC 不是 MVVM。 MVC 和 MVVM 都使用术语“视图模型”,但想法略有不同。我认为您缺乏使用 ASP.NET MVC 的经验,并且您尝试从您的 MVVM 知识的角度来看。
猜你喜欢
  • 2021-11-06
  • 2016-10-03
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多