避免表示层和DAL之间的依赖关系

时间:2017-07-15 20:21:30

标签: c# asp.net-mvc architecture

我正在撰写一个简单的Web应用程序,而我遇到了一个架构问题。让我们说BLL层中有一个Customer类:

public class Customer
{
    public int Id { get; set; }

    public Person PersonalData { get; set; }

    public int? MaximalPrice { get; set; }

    public string Note { get; set; }

    public Customer()
    {
        PersonalData = new Person();
    }
}

我将把这个类的数据创建分为两个阶段。在第一阶段,用户将提供有关客户的基本信息,以便他以后能够完成。所以我在表示层创建了两个视图。一个只显示基本信息,第二个显示所有。

基本:

 <div class="input-field col s6">
        <i class="material-icons prefix">phone</i>
        @Html.TextBoxFor(m => m.TelephoneNumber, new {id = "icon_telephone", mask = "telephoneNumber"})
        @Html.LabelFor(m => m.TelephoneNumber)
    </div>
    <div class="input-field col s6">
        <i class="material-icons prefix">credit_card</i>
        @Html.TextBoxFor(m => m.MaximalPrice, new { id = "credit_card" })
        @Html.LabelFor(m => m.MaximalPrice)
    </div>
</div>
<div class="row">
    <div class="input-field col s12">
        <i class="material-icons prefix">note</i>
        @Html.TextBoxFor(m => m.Note, new { id = "note_add" })
        @Html.LabelFor(m => m.Note)
    </div>
</div>

完整(部分视图):

<div class="row">
    <div class="input-field col s6">
        @Html.TextBoxFor(m => m.FirstName)
        @Html.LabelFor(m => m.FirstName)
    </div>
    <div class="input-field col s6">
        @Html.TextBoxFor(m => m.LastName)
        @Html.LabelFor(m => m.LastName)
    </div>
</div>
<div class="row">
    <div class="input-field col s6">
        @Html.TextBoxFor(m => m.Street)
        @Html.LabelFor(m => m.Street)
    </div>
    <div class="input-field col s6">
        @Html.TextBoxFor(m => m.City)
        @Html.LabelFor(m => m.City)
    </div>
</div>
<div class="row">
    <div class="input-field col s6">
        @Html.TextBoxFor(m => m.BirthDate)
        @Html.LabelFor(m => m.BirthDate)
    </div>
    <div class="input-field col s6">
        @Html.TextBoxFor(m => m.TelephoneNumber , new { mask = "telephoneNumber" })
        @Html.LabelFor(m => m.TelephoneNumber)
    </div>
</div>

现在我假设当用户创建客户的基本版本时,他将无法在完整数据客户列表中看到它,并且当他完成客户数据时,他将无法在基本版本上看到它客户名单。 为了实现它,我正在考虑两种解决方案。

  1. 在BLL中创建函数,该函数将遍历我的类的所有属性,并检查是否存在任何非基本的属性,该属性已经非空。
  2. 扩展客户的DAL域并添加指示客户是否为&#34; basic&#34;或&#34;完整&#34;
  3. 但上述解决方案都不是完美的。首先,由于迭代了所有Customer条目的所有属性,因此大数据集的性能会降低。所以这似乎应该避免。 我不喜欢第二种选择,这似乎解决了这个问题,因为它在表示层和数据访问层之间创建了依赖关系。我觉得在数据库中创建额外的另一列只是为了演示目的不是一个好主意。

    所以,我的问题是:有没有更好的选择?你怎么看待这个选择?你会如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

  1. DAL应该能够过滤DAL.Custumers.Get(_columns_)之类的列,BLL会根据登录的用户类型做出决定。

答案 1 :(得分:0)

为基本表单和完整表单创建ViewModel。说.. BasicInfoFormViewModel和FullInfoViewModel,只包含其特定形式的属性。

提交表单时,在控制器操作中,将视图模型数据映射到Customer类(或您作为实体使用的任何类),并保存实体。

我认为您不需要扩展域名以表明客户是基本的还是完整的。您可以简单地使用一些服务层逻辑来检查实体并确定基本/完整状态。您的观点将使用此决定来显示必要的表单。