MVC业务逻辑访问模型

时间:2012-04-13 08:17:39

标签: c# asp.net-mvc

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

  • GUI(模型,视图,控制器,...)
  • DAL(实体数据库和存储库+ IRepository)
  • BL(我的疑问)
  • COMMON
  • 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专家告诉我们使用的,因为这就是他的工作方式。

2 个答案:

答案 0 :(得分: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; }
}

BL:

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);
    }
}

答案 1 :(得分:1)

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

结果,你的问题源于那里的模型。如果要将项目拆分为图层,则应移动模型!

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

所以,不用多说,将模型移出GUI层。

比你的设计更实用的方法是遵循Steve Sanderson和Adam Freeman倡导的Domain设计(Pro ASP.NET MVC 3.0框架,Apress [版本4的书尚未出版])。它与您的设计类似,但更实用。在不深入细节的情况下,您可以将模型和商务层分离为域项目。这为您提供了更实用的设计。

除非你有特殊要求,否则我认为WCF也可能过度。 MVC旨在提供您需要的面向服务的方法。

我建议阅读S Sanderson和Freeman一书。它会给你带来很多痛苦。