![](/img/trans.png)
[英]Unable to access data in an ASP.NET MVC web application using Entity Framework and SQL Server database
[英]asp.net MVC 4 with Data Access Layer using Entity Framework 5?
在我的项目中,我首先在一个解决方案中使用实体框架和以下项目创建了数据访问层:1。 领域模型-实体模型(.edmx)2.服务-商业服务,Dtos,Infrastructure(Configurator),接口和模型(存储库)
现在的问题是,我想将此数据访问层连接到我的MVC项目,我不知道如何使数据访问层项目充当我的mvc项目的模型。 所以谁能告诉我如何将我的数据访问层连接到我的控制器和视图中 。 提前致谢 !
我认为您要问的是控制器与您的服务和数据层进行交互的最佳方式是什么?
一种选择是使用中介者模式 ,并将服务与控制器分离。
ASP.NET MVC应用程序有一个很好的实现: ShortBus ,我在许多项目中使用的nuget上也可以使用ShortBus ,到目前为止,它的运行效果很好。
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"));
}
}
我喜欢这种模式的地方是:
控制器不需要知道如何创建用户。 它发出命令,并由适当的业务逻辑处理。
每个处理程序都可以要求其所需的服务。 无需使用仅由单个操作使用的服务来污染控制器。
单元测试真的很容易。 我使用了模拟程序,只需要验证_mediator.Send()是否已使用正确的参数进行了调用。 然后,为了测试处理程序,我模拟了IDatabaseService和IEmailService并验证了在两种情况下它们是否被正确调用。
命令和查询可以被重用,并且调用者再也不需要知道处理请求所需要的内容。
至于视图,我建议使用ViewModels 。
每个视图都有自己的ViewModel,该ViewModel包含显示该特定页面所需的任何内容。 然后,您可以将域对象映射到它们自己的单个ViewModel,可能需要使用AutoMapper 。
ViewModels的优点是您可以适当地格式化数据(也许格式化DateTime),然后您的View不需要任何特殊的逻辑。 如果以后您决定更新DateTime格式,则只需在一个地方进行更改。
创建一个(共享的)接口以传递到DAL和MVC之间的层,尤其是在进行单元测试时。 使用存储库模式。 在这里查看:
http://csharppulse.blogspot.com/2013/09/learning-mvc-part-5repository-pattern.html
这应该让你走...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.