如何为我的MVC项目创建外部DAL?
有一件事我真的没有。假设我的MVC项目中有一个模型。模型的名称是Person {int id,string name}。
现在在我的DAL中我有一个方法:
public Person Select(int id) - 从db加载数据并返回Person对象。
如果DAL是MVC项目的一部分,这可以正常工作。但是当我为我的外部DAL创建一个类库(所以我可以在另一个应用程序中使用它而不引用整个MVC项目)时,它将不知道Person模型,因为所有模型都隐藏在MVC项目中。
我无法从DAL引用MVC项目,因为MVC项目需要引用DAL才能使用它。我对实体框架不感兴趣我想要自己的解决方案(不确定EF是否解决了这个问题)。
有秘密的方法吗?或者我的方法(传递整个模型)是错误的,我的Select方法应该返回某种类型的数组或列表与属性?我相信这是表数据网关的概念(不确定),只是传递属性而不是整个对象。
答案 0 :(得分:2)
您需要在数据访问层项目中定义模型类。这样,它们将可用于DAL项目(因为它们在项目中)和MVC项目(因为它引用了DAL项目)。
实体框架会处理这个问题,但这只是因为生成的实体模型成为EF将生成的.edmx文件的一部分/同一位置。
您应该能够将模型文件夹拖放到DAL中。但是,请注意,您的命名空间将被破坏,您需要更新每个文件中的命名空间。此外,您需要在MVC项目中的任何位置添加适当的引用,您可以在其中使用其中一个模型。例如,如果您的模型位于Data.Models
命名空间中,则控制器顶部需要以下内容:
using Data.Models;
答案 1 :(得分:1)
你的问题是:
“当我为我的外部DAL创建一个类库时(所以我可以在其中使用它) 另一个没有引用整个MVC项目的应用程序)它不会 知道Person模型,因为所有模型都隐藏在MVC中 项目“。
我承认你选择的措辞对我没有意义。如果您的DAL上有公共方法,则模型不能“隐藏” - 它们必须具有与您的方法相同的[公共]可访问性。 POCO对象应该在应用程序中最常见的程序集中定义,以便可以在整个程序中共享它们。如果您的代码通过DAL加载数据,可能是使用DAL返回的模型 - 因此DAL是最合理的地方。基本前提是您希望尽可能简化项目。
如果你有一个场景,部分应用程序可能永远不会触及DAL,但你仍然希望你的模型存在,那么我建议采用以下两种策略之一:
答案 2 :(得分:1)
在DAL中添加模型类。创建ViewModel项目并添加具有person定义属性的PersonVM类。在select方法中填充PersonVM,并在DAL((理想情况下是业务层项目)和MVC应用程序中添加Viewmodel项目的引用。在View中使用Viewmodel类而不是模型
答案 3 :(得分:0)
整个POCO课程需要在您的DAL中。你的MVC模型中唯一应该是从DAL对象到你的View的映射:
private WorksiteAddress _worksiteToEdit { get; set; }
public WorksiteAddress WorksiteToEdit
{
get
{
if (_worksiteToEdit != null) return _worksiteToEdit;
if (WorksiteId != null)
{
using (var db = new YourDALContext())
{
_worksiteToEdit = db.WorksiteAddresses.FirstOrDefault(x => x.Id == WorksiteId);
}
}
if(_worksiteToEdit == null) _worksiteToEdit = new WorksiteAddress();
return _worksiteToEdit;
}
set { _worksiteToEdit = value; }
}
[Required, DisplayName("Address")]
public string StreetAddress
{
get { return WorksiteToEdit.StreetAddress; }
set { WorksiteToEdit.StreetAddress = value; }
}
[Required]
public string City
{
get { return WorksiteToEdit.City; }
set { WorksiteToEdit.City = value; }
}
[Required]
public string State
{
get { return WorksiteToEdit.State; }
set { WorksiteToEdit.State = value; }
}
[Required, DisplayName("Zip Code")]
public string ZipCode
{
get { return WorksiteToEdit.ZipCode; }
set { WorksiteToEdit.ZipCode = value; }
}
上例中的Worksite
对象应完全存在于您的DAL中(包括您需要保存时从此模型调用的SaveOrUpdate()方法)
答案 4 :(得分:-3)
- 你在DAL项目中使用nuget来添加ASP.NET MVC DAL项目中的-add控制器,模型和视图文件夹 - 现在将DAL项目引用到您的主项目