将ADO.NET用于ASP.NET Core中的数据访问层

时间:2018-09-08 21:39:21

标签: c# asp.net asp.net-core ado.net

我正在尝试为ASP.NET Core API推出高性能DAL。我想使用ADO.NET,但在设计软件体系结构时遇到了困难。我正在寻求帮助,以讨论一种好的方法。

我所拥有的

我的代码库将包含三个项目

  • MyApp.API
  • MyApp.Repositories(数据访问层)
  • MyApp.Services(业务逻辑)

我将在IUnitOfWork中实现MyApp.Repositories,并在SqlUnitOfWork中创建一个具体的MyApp.APIStartup.csIUnitOfWork注册到SqlUnitOfWork。稍后,当我获得更多数据源(Mongo等)时,可以合并一个UnitOfWorkFactory

问题

  1. 我应该在Startup.cs中注册每个存储库还是只是将它们添加为IUnitOfWork的属性?这里的想法是,我将在控制器,服务和存储库中使用依赖注入,但只需注入IUnitOfWork

  2. 如何将我的连接字符串传递到SqlUnitOfWork中?我知道连接字符串应位于MyApp.API之内。

2 个答案:

答案 0 :(得分:2)

另一个答案是无关紧要的,因为这表明我使用了我想避免的EF。

我用存储库模式实现了Dapper。我没有使用工作单元,因为我得出结论会导致我不想拥有的性能下降。

这是我实现的原始原型。 https://github.com/lenardchristopher/AdoAspDotNetCoreTest

答案 1 :(得分:1)

我相信您正在使用aspnet-core,因此可以使用Entity Framework,因为您的ORM在这种情况下可以工作。

我同意您将存储库注册为IUnitOfWork的一部分,然后将其作为服务添加到DI容器中,然后将其注入控制器中。

要回答第二个问题,我们假设您的SqlUnitOfWork实现具有一个接收DbContext实例的构造函数。

  

在ASP.NET Core中,DbContext被添加到DI容器中,因此   需要或依赖于DbContext的任何其他服务   它是构造函数,它将由DI自动解决   容器。

首先请记住在appsettings.json中定义连接字符串。

enter image description here

然后,让我们使用该连接字符串向我们的DI容器中添加一个DbContext对象和一个小小的Futher reading on Configuring DbContext in EF Core

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Database")));
}

在那之后,向需要我们的上下文的DI容器注册其他服务将非常容易,因为该容器将为我们解决该依赖性。

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IUnitOfWork, SqlUnitOfWork>();
}

希望这可以回答您的问题。如果没有,让我知道。