2

我目前在使用实体框架时在 ASP.NET MVC 4 中工作。我以前从未使用过 MVC,并且构建了一个包含以下层的项目:

  • GUI(模型、视图、控制器……)
  • DAL(实体数据库和存储库 + IRepository)
  • BL(我的疑问)
  • 常见的
  • WCF
  • 测试

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

这是我正在尝试的代码:

在我的 BL 中:

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 专家告诉我们使用的,因为这就是他的工作方式。

4

2 回答 2

2

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

查看型号:

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);
    }
}
于 2012-04-13T08:57:06.153 回答
1

您的 GUI 层只是其他层提供的功能的消费者。

结果,您的问题源于将模型放在其中。如果要将项目拆分为层,则应移动模型!

Visual Studio 创建的默认项目仅在 GUI 层中具有模型,以应对人们不打算将 GUI 项目拆分为层的情况。即,初学者。它与 MVC 方法无关。在拆分层时,您应该将模型移动到“域层”(见下文)。

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

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

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

我建议阅读 S Sanderson 和 A Freeman 的书。它会让你免于很多痛苦。

于 2012-04-13T09:27:52.193 回答