我正在将我的服务注入到我的控制器中。我应该将我的服务注入到我的 ViewModel 中吗?

发布于 2025-01-08 19:18:58 字数 2744 浏览 1 评论 0原文

因此,我一直在构建一个全新的网站来取代我们当前的经典 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

腻橙味 2025-01-15 19:18:58

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

另一方面,将任何服务注入视图模型将违背视图模型的理念——保存数据但不执行任何操作的类。您将如何处理视图模型中的服务?

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?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文