【问题标题】:asp.net MVC 4 with Data Access Layer using Entity Framework 5?asp.net MVC 4 与使用实体框架 5 的数据访问层?
【发布时间】:2014-02-17 18:24:19
【问题描述】:

在我的项目中,我首先使用实体​​框架创建了我的数据访问层,并在单个解决方案中包含以下项目, 1.域模型-实体模型(.edmx) 2.Services - 业务服务、Dtos、基础设施(配置器)、接口和模型(存储库)

现在的问题是,我想将此数据访问层连接到我的 MVC 项目,我不知道如何使数据访问层项目充当我的 mvc 项目的模型。所以谁能告诉我如何将我的数据访问层连接到我的控制器和视图中。任何参考都表示赞赏。提前致谢!

【问题讨论】:

  • 将数据访问层的引用添加到 UI 项目并开始使用类

标签: asp.net asp.net-mvc entity-framework visual-studio-2012


【解决方案1】:

我认为您要问的是控制器与您的服务和数据层交互的最佳方式是什么?

一种选择是使用mediator pattern,并将服务与控制器分离。

对于 ASP.NET MVC 应用程序有一个很棒的实现:ShortBus,也可以在 nuget 上找到,我在许多项目中都使用过,到目前为止效果很好。

ShortBus 的优点之一是它支持依赖注入。在下面的示例中,所有服务都是使用 Ninject 创建的,并且需要适当的注册。

基本思想是定义控制器将使用的查询和命令,然后添加处理程序来执行实际工作。

public class AddUser : ICommand<User>
{
    public string Email { get; set; }
} 

然后是处理程序:

public class AddUserHandler : ICommandHandler<AddUser, User>
{
    private IDatabaseService _database;
    private IEmailService _email;

    public AddUserHandler(IDatabaseService database, IEmailService email)
    {
         _database = database;
         _email = email;
    }

    public User Handle(AddUser command) 
    {
        bool created = _database.CreateUser(command.Email);

        if (created)
        {
            _email.SendWelcome(command.Email);
        }
    }
}

然后在你的控制器中,你所要做的就是发出命令:

public class UsersController : Controller
{
     private IMediator _mediator;

     public UsersController(IMediator mediator)
     {
         _mediator = mediator;
     }

     public ActionResult Create(string email)
     {
         User user = _mediator.Send(new AddUser("foo@bar.com"));
     }
}

我喜欢这种模式的地方是:

  1. 控制器不需要知道如何创建用户。它发出一个命令,并由适当的业务逻辑处理它。

  2. 每个处理程序都可以要求它需要的服务。无需使用仅由单个操作使用的服务来污染控制器。

  3. 单元测试真的很容易。我使用模拟,只需要验证 _mediator.Send() 是否使用正确的参数调用。然后为了测试处理程序,我模拟了 IDatabaseService 和 IEmailService 并验证它们在 2 种情况下被正确调用。

  4. 命令和查询可以重复使用,而且调用者永远不需要知道处理请求需要什么。

至于视图,我推荐ViewModels

每个 View 都有自己的 ViewModel,它包含显示该特定页面所需的任何内容。然后,您可以将域对象映射到它们自己的单独 ViewModel,可能使用AutoMapper

ViewModels 的好处是您可以适当地格式化数据(可能格式化 DateTime),然后您的视图不需要任何特殊逻辑。如果稍后您决定更新 DateTime 格式,您只需在一处进行更改。

【讨论】:

  • 我刚刚开始使用 Shortbus。我正在努力在我的 IoC 注册表中注册 IMediator。有任何想法吗?你是怎么注册的?
  • 我正在使用 Ninject,它看起来像:gist.github.com/mfanto/ccefbd198e3c33994fae 关键是要设置 IDependencyResolver。这是 Ninject 用来解析处理程序的。
  • 请注意,该方法位于 NinjectWebCommon.cs 中,由 CreateKernel() 调用以设置 Ninject。如果您使用不同的 IoC 容器,您可以将 DependencyResolver.SetResolve(...) 更改为适合您容器的方法。
【解决方案2】:

创建(共享)接口以传递到 DAL 和 MVC 之间的层,尤其是在您进行单元测试时。使用存储库模式。在这里查看:

http://csharppulse.blogspot.com/2013/09/learning-mvc-part-5repository-pattern.html

这应该能让你继续前进......

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多