用于访问模型的 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 专家告诉我们使用的,因为这就是他的工作方式。
我不确定你的要求是什么,但这是我的答案。显示地址列表的简单方案:
查看型号:
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·桑德森和弗里曼的书。 它会让你免于很多痛苦。