C# MVC业务逻辑访问模型
我目前在ASP.NET MVC 4中使用实体框架。我以前从未使用过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
- GUI(模型、视图、控制器、…)
- DAL(实体数据库和存储库+IRepository)
- BL(带我的疑问)
- 普通的
- WCF
- 测试
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);
}
}