我正在尝试为ASP.NET Core API推出高性能DAL。我想使用ADO.NET,但在设计软件体系结构时遇到了困难。我正在寻求帮助,以讨论一种好的方法。
我的代码库将包含三个项目
我将在IUnitOfWork
中实现MyApp.Repositories
,并在SqlUnitOfWork
中创建一个具体的MyApp.API
。 Startup.cs
将IUnitOfWork
注册到SqlUnitOfWork
。稍后,当我获得更多数据源(Mongo等)时,可以合并一个UnitOfWorkFactory
。
我应该在Startup.cs
中注册每个存储库还是只是将它们添加为IUnitOfWork
的属性?这里的想法是,我将在控制器,服务和存储库中使用依赖注入,但只需注入IUnitOfWork
。
如何将我的连接字符串传递到SqlUnitOfWork
中?我知道连接字符串应位于MyApp.API
之内。
答案 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
中定义连接字符串。
然后,让我们使用该连接字符串向我们的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>();
}
希望这可以回答您的问题。如果没有,让我知道。