用于访问模型的 MVC 业务逻辑

本文关键字:业务 MVC 访问 模型 用于 | 更新日期: 2023-09-27 18:30:54

我目前正在使用实体框架 ASP.NET MVC 4。我以前从未使用过MVC,并且构建了一个具有以下层的项目:

  • GUI (模型、视图、控制器,...)
  • DAL (实体数据库和存储库 + 独立)
  • BL (与我的查询)
  • 通用
  • WCF
  • 测试

现在,我正在尝试在我的 BL 中编写一个查询,该查询使用来自我的 GUI 层的模型。由于您不能简单地引用 GUI,我真的不知道在这里该怎么做。

这是我尝试的代码:

在我的提单中:

public static List<PSNAdres> GetAdres(IZoekRepository repo)
{
    List<PSNAdres> lijstTypes = (from t in repo.PSNAdres
                      select new PSNAdres {t.Gemeente, t.Straat, t.Postcode}).ToList(); 
    return lijstTypes;
}

正如我所说:我是MVC的新手。这种分层布局是我们的 MVC 专家告诉我们使用的,因为这就是他的工作方式。

用于访问模型的 MVC 业务逻辑

我不确定你的要求是什么,但这是我的答案。显示地址列表的简单方案:

查看型号:

public class AddressListViewModel 
{
    public List<AddressViewModel> AddressList { get; set; }
    public bool CanAdd { get; set; }
}
public class AddressViewModel
{
    public string Country { get; set; }
    public string City { get; set; }
    public string Street { get; set; }
    public bool CanEdit { get; set; }
    public bool CanDelete { get; set; }
}

提单:

public static List<Address> GetAddressList()//Doesn't take repository here, repositories are injected in constructor
{
    return adresRepo.PSNAdres.ToList(); 
}

控制器

public class AddressController : BaseController
{
    public ActionResult List()
    {
        var addressList = blObject.GetAddressList();
        var model = new AddressListViewModel();
        model.AddressList = addressList.Select(a => 
            new AddressViewModel 
            {
                Country = a.Country.Name,
                City = a.City,
                Street = a.Street,
                CanDelete = ...check user access here...,
                CanEdit = ...check user access here...
            });
        model.CanAdd = ...check user access here...
        return View(model);
    }
}

您的 GUI 层只是其他层提供的功能的使用者。

因此,您的问题源于将模型放在那里。如果要将项目拆分为多个层,则应移动模型!

Visual Studio 创建的默认项目仅在 GUI 层中具有模型,以防人们不会将 GUI 项目拆分为多个层。 即,初学者。 它与MVC方法无关。 拆分层时,应将模型移动到"域层"中(见下文)。

因此,事不宜迟,将您的模型移出 GUI 层。

比你的设计更实用的方法是遵循Steve Sanderson和Adam Freeman(Pro ASP.NET MVC 3.0 Framework,Apress[版本4的书尚未出版])倡导的域设计。 它与您的设计相似,但更实用。 在不赘述太多细节的情况下,在该方法中,您将模型和业务层分离到一个域项目中。 这为您提供了更实用的设计。

除非您有特定的要求,否则我认为 WCF 也可能是矫枉过正。 MVC 旨在在您需要的地方提供面向服务的方法。

我建议阅读S·桑德森和弗里曼的书。 它会让你免于很多痛苦。