数据访问层和MVC分离?

时间:2014-01-10 23:50:21

标签: c# asp.net asp.net-mvc design-patterns

如何为我的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方法应该返回某种类型的数组或列表与属性?我相信这是表数据网关的概念(不确定),只是传递属性而不是整个对象。

5 个答案:

答案 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,但你仍然希望你的模型存在,那么我建议采用以下两种策略之一:

  1. 在需要模型的地方创建单独的“模型”项目和参考(最好在有广泛的对象模型集时)。
  2. 使用VisualStudio“Add as Link”将模型文件导入到使用它们的项目中(如果您的模型相对较少且几乎没有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项目引用到您的主项目