2012-04-13 114 views
2

我目前在使用实体框架的同时在ASP.NET MVC 4中工作。我从来没有与MVC工作过,并有建立一个项目具有以下层: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

这里可能值得检查一下你的术语。 GUI应该处理'视图'(或可能是视图模型),但不直接处理模型。 – dougajmcdonald 2012-04-13 08:26:03

+0

一般来说,你的BL(Domain)应该只处理域对象。如果您需要GUI(视图)模型在GUI层(或为此唯一目的的层)进行转换。 – 2012-04-13 08:27:07

+0

添加了一些关于我的GUI具有的附加信息 – whodares 2012-04-13 08:36:49

回答

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

感谢这里的答案,但这是我现在试图工作,它给我的问题。 GUI,BL,DAL ......都在不同的项目中,但在同一个解决方案文件中。由于从BL到GUI的引用是不允许的,我正在寻找一种方法来解决它。目前BL(在BL项目中)无法访问我的PSNAdres模型(在GUI中),我正在寻找解决此问题的方法。 – whodares 2012-04-13 09:16:14

+0

@ThomasSchellekens:PSNAdres如何在GUI中? PSNAdres是代表数据库表还是创建用于演示目的的类。如果首先,它不应该在GUI中。 – LukLed 2012-04-13 09:18:49

+0

我在我的DAL中获取我的数据库(视图)。然后我把它放在存储库中,然后转到我的BL上。在那里,我尝试使用PSNAdres(GUI中的模型),它将我视图中的某些列映射到PSNAdres。关于MVC,我不确定是否有终结者,所以我希望我能正确解释它。 – whodares 2012-04-13 09:22:18

1

您的GUI层只是一个功能性的消费由提供其他层。

因此,您的问题源于模型在那里。如果你正在将你的项目分解成图层,你应该移动模型!

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

因此,不要再过度劳累,将模型移出GUI层。

比您的设计更实用的方法是遵循Steve Sanderson和Adam Freeman(Pro ASP.NET MVC 3.0 Framework,Apress [第4版的书尚未出版])提倡的域设计。它与你的设计相似,但更实用。在没有详细讨论的情况下,通过这种方法,您可以将模型和商业图层分离为一个Domain项目。这给你一个更实际的设计。

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

我会推荐阅读S桑德森和弗里曼书。它会让你很痛苦。

+0

+1为书籍参考,爱这些家伙! – dougajmcdonald 2012-04-13 15:04:54