C# MVC业务逻辑访问模型

C# MVC业务逻辑访问模型,c#,asp.net-mvc,C#,Asp.net Mvc,我目前在ASP.NET MVC 4中使用实体框架。我以前从未使用过MVC,并构建了一个包含以下层的项目: GUI(模型、视图、控制器、…) DAL(实体数据库和存储库+IRepository) BL(带我的疑问) 普通的 WCF 测试 现在,我尝试在BL中编写一个查询,它使用GUI层中的一个模型。由于您不能简单地引用GUI,我真的不知道在这里该做什么 下面是我试图解释的代码: 在我的BL中: public static List<PSNAdres> GetAdres(IZoekR

我目前在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;
}
publicstaticlist-GetAdres(IZoekRepository-repo)
{
列表lijstTypes=(来自repo.PSNAdres中的t
选择新的PSNAdres{t.Gemeente,t.Straat,t.Postcode});
返回类型;
}

正如我所说:我是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; }
}

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

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

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

因此,无需进一步麻烦,即可将模型移出GUI层。

比您的设计更实用的方法是遵循Steve Sanderson和Adam Freeman倡导的域设计(Pro ASP.NET MVC 3.0 Framework,Apress[版本4的书还没有出版])。它与您的设计相似,但更实用。在这种方法中,您可以将模型和业务层分离到一个域项目中,而无需太多细节。这将为您提供更实用的设计

除非您有具体的要求,否则我认为WCF可能也太过分了。MVC被设计为在您需要的地方提供面向服务的方法


我建议你读S·桑德森和弗里曼的书。这会让你省去很多痛苦。

也许值得在这里检查一下你的术语。GUI应该处理“视图”(或者可能是视图模型),而不是直接处理模型。一般来说,BL(域)应该只处理域对象。如果您需要GUI(视图)模型,请在GUI层(或仅用于此目的的层)中进行转换。添加了一些有关我的GUI的附加信息。谢谢您的回答,但这是我现在正在尝试的工作方式,它给我带来了问题。GUI、BL、DAL,。。。都在不同的项目中,但在同一个解决方案文件中。由于从BL到GUI的引用是不允许的,我正在寻找一种方法来修复它。目前BL(在BL项目中)无法访问我的PSNAdres模型(在GUI中),我正在寻找一种方法来解决这个问题。@ThomasSchellekens:PSNAdres如何在GUI中?是表示数据库表的PSNAdres还是为表示而创建的类。首先,它不应该在GUI中。我在DAL中获取数据库(视图)。然后我把它放在一个存储库中并转到我的BL。在那里我尝试使用PSNAdres(GUI中的模型),它将某些列从我的视图映射到PSNAdres。我不确定MVC的术语,所以我希望我解释得正确。这不是最好的主意,你在控制器中填充模型,你应该在控制器中实例化模型,模型可以填充自己(也称为瘦控制器,胖模型方法)@马提托莫:这不是最好的主意的原因是什么?
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);
    }
}