0

创建新的 ASP.NET MVC3 应用程序时,默认项目中有一个Models文件夹。此Models文件夹包括AccountModels- RegisterModelLoginModel等。

我有一个单独的 DAL 项目 - 它包括 arepository和 a service

现在,我有一个方法service

TblUser Register(RegisterModel model);

为此,我必须在我的数据项目中引用 Web 项目。

这是合适的,还是应该将我的Models文件夹包含在我的数据项目中?

4

1 回答 1

1

您的第一个选项不合适。这就是所谓的循环依赖,它很糟糕。

您的第二个选择更好,但仍然不是很好。您的模型类无疑将具有仅适用于您的 ui 的字段和方法。它们不属于您的数据层,就像您的数据对象不属于您的 Web 层一样。这是耦合的一个例子——也称为关注点分离不佳——而且它也很糟糕。

最好的选择是将两层所需的数据分离到一组不同的类中(有时称为 dto 的 - 数据传输对象 - 或 poco 的 - 普通的旧类对象)。根据您的需要,这些类可以驻留在您的数据项目中或完全属于自己的项目中。如果您的服务驻留在 WCF 服务中,则这些类通常是 DataContracts。然后,在您的 MVC 项目中,您应该拥有您的模型,就像它们现在一样,但它们应该包含对您的 POCO 的引用,而不是保存它们自己的任何数据。因此,在您的特定情况下,您将在数据项目中创建一个 RegistrationInfo 类(或任何您想调用的类),然后将一个 RegistrationInfo 类型的字段添加到您的模型并将其传递给您的服务而不是整个 RegistrationModel。

编辑:添加了一个例子

namespace MyProject.Data.Objects {
    public class RegistrationInfo {

        [Required]
        public string Username { get; set; }

        [Required]
        public string Password { get; set; }

        [Required]
        public string Email { get; set; }

    }
}

namespace MyProject.Data {
    public class MyService {
        public TblUser Register(RegistrationInfo info) {
            // .. save to the database ..
        }
    }
}

namespace MyProject.UI.Models {
    class RegistrationModel {
        public RegistrationInfo Info { get; set; }

        /* Fields which the ui needs but the database does not */
        public bool ConfirmPassword { get; set; }
        public bool AllowFreeEmailAddresses { get; set; }

        public void Save() {
            new MyProject.Data.MyService().Register(this.Info);
        }

        public RegistrationModel() {
            this.Info = new RegistrationInfo();
        }
    }
}
于 2012-10-25T03:14:55.083 回答