【问题标题】:asp.net mvc3, which layer should I put my code in?asp.net mvc3,我应该把我的代码放在哪一层?
【发布时间】:2012-05-17 14:47:36
【问题描述】:

我正在使用 asp.net mvc3 构建一个应用程序。我在这个项目中添加了两个层,存储库和服务层。我的一些代码,我不确定我应该把它们放在哪一层。

在我的注册页面上,要创建一个帐户,我只要求用户输入他们的电子邮件和密码,它使用 UserRegisterViewModel。在我将它添加到数据库之前,我的用户表需要更多信息。

我需要从 UserRegisterViewModel 创建一个用户实体:

user.ip= "1.1.1.1";
user.createddate="11/11/1911";
....

上面的代码,我应该把它们放在哪里? webui、存储库或服务层。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 repository-pattern service-layer


    【解决方案1】:

    我会在“用户”实体的构造函数中添加“CreatedDate”,并在接收 ViewModel 对象的控制器中添加 IP 地址。

    你可能不知道:你可以使用 AutoMapper 将 ViewModel 映射到实体。

    【讨论】:

    • 谢谢,我会试试automapper,但是当我在User和UserRegisterViewModel之间进行映射时,我应该在哪里做呢? web ui层、领域层还是服务层?
    • 在您的控制器中,所以这可能是 Web UI 层 :) 请记住,您应该只初始化一次 AutoMapper 映射,因此在您的应用程序启动时引导它们。然后您只需要在您的控制器中执行此操作: Mapper.Map(userobject);您还可以通过将其作为第二个参数传递给 Map() 函数来映射到现有实体。
    【解决方案2】:

    您只能从请求中获取 IP 地址,因此您可以在 Action 中“获取”它

    类似的东西

    [HttpPost]
    public ActionResult Login(UserRegisterViewModel model) {
        if(ModelState.IsValid) {
            SaveLogonToAudit(model.Username);
        }
        return View(model);
    }
    
    private void SaveLogonToAudit(string username) {
        var user = new UserAccount(username, Request.Browser.Browser, Request.Browser.Type, Request.UserHostAddress);
        user.Save();
    }
    

    用户实体可以存在于另一个层中,您的 UserRegisterViewModel 将存在于 MVC UI 层中。在您的视图中拥有一个代表数据的 ViewModel 和代表您的用户实体的另一层中的一个完全独立的类是完全正常的。这是很好的设计。您的 User 实体可以位于 ServiceLayer 中并具有与之关联的业务规则。然后该类将调用您的存储库层以保存其数据。

    我同意 Leon Cullens 的观点,CreateDate 应该存在于 User 实体中,这就是为什么你看不到我设置它的原因。用户实体应该处理它自己的调用您的 RepositoryLayer 的 CRUD 操作。在 ctor 中设置 CreateDate 或更好,有一个基类,其中包含用户将在内部使用的 CreateDate、CreatedBy、LastUpdateDate、LastUpdatedBy。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-25
      相关资源
      最近更新 更多