如何在 ASP.NET 核心 MVC 中设计具有依赖注入的存储库模式?
How to design a Repository Pattern with Dependency Injection in ASP.NET Core MVC?
作为 ASP.NET Core 1.0 MVC 的新手,我决定为 MVC Core 应用程序使用存储库模式;我正在为数据层 SampleDbContext
使用 SQL 数据库,我想为我的一些业务实体创建一个存储库 class。到目前为止,我已经在 startup.cs
、CustomerController.cs
和 CustomerRepository.cs
文件中完成了以下操作,其中示例实体是 "Customer".
在启动的ConfigureServices
方法中Class:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<SampleDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("SampleDB")));
}
在控制器中:
public class CustomerController : Controller
{
private SampleDBContext _context;
private CustomerRepository = new CustomerRepository (new SampleDBContext());
public CustomerController(SampleDBContext context)
{
_context = context;
}
}
在存储库中:
public class CustomerRepository
{
private SampleDBContext _context;
public CustomerRepository(SampleDBContext context)
{
_context = context;
}
}
通过这种设计,我将 SampleDbContext
作为服务插入 startup.cs
一次,然后对于每个控制器(接收依赖注入)我实例化一个相应的存储库,传递一个新的SampleDbContext
的实例。
数据库上下文的这种重复实例化是多用户环境的良好设计吗?
我想我可以将每个存储库作为服务添加到 startup.cs
,但这看起来不太好。
请告诉我适合我的情况的良好设计实现,或者如果我迷路了,请让我走上正轨。
我不确定这是最好的方法,但我一直将存储库创建为控制器实现的接口。
IRepository.cs:
public interface IRepository
{
SomeList GetSomeList(string userId);
Some GetSomeDetail(int someId);
}
DbInterface.cs:
public class DbInterface : IRepository
{
public SomeList GetSomeList(string userId)
{
}
public Some GetSomeDetail(int someId)
{
}
}
SomeList 是我定义的一种数据类型,其中包含要作为列表显示在页面上的所有属性。 IE。任务应用程序中的任务列表。有些是定义 returns a 任务的详细信息的数据类型(因此输入将是 taskId 等)。
如果这是一个错误的方法,很高兴得到纠正。
有人认为 DbContext 本身是一种存储库模式。如果您想走那条路,可以在 ASP.NET Core and Angular 2.
下载示例代码
例如-
public class CustomerController : Controller
{
private SampleDBContext _context;
public CustomerController(SampleDBContext context)
{
_context = context;
}
public async Task<IActionResult> Index(int id)
{
var user = _context.Users.Where(i => i.Id == id).FirstOrDefault();
...
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<SampleDBContext>(options =>
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])
);
}
您可以查看simple example如何使用存储库模式:
您创建存储库接口:
using System.Collections.Generic;
namespace TodoApi.Models
{
public interface ITodoRepository
{
void Add(TodoItem item);
IEnumerable<TodoItem> GetAll();
TodoItem Find(long key);
void Remove(long key);
void Update(TodoItem item);
}
}
然后执行:
using System;
using System.Collections.Generic;
using System.Linq;
namespace TodoApi.Models
{
public class TodoRepository : ITodoRepository
{
private readonly TodoContext _context;
public TodoRepository(TodoContext context)
{
_context = context;
Add(new TodoItem { Name = "Item1" });
}
public IEnumerable<TodoItem> GetAll()
{
return _context.TodoItems.ToList();
}
public void Add(TodoItem item)
{
_context.TodoItems.Add(item);
_context.SaveChanges();
}
public TodoItem Find(long key)
{
return _context.TodoItems.FirstOrDefault(t => t.Key == key);
}
public void Remove(long key)
{
var entity = _context.TodoItems.First(t => t.Key == key);
_context.TodoItems.Remove(entity);
_context.SaveChanges();
}
public void Update(TodoItem item)
{
_context.TodoItems.Update(item);
_context.SaveChanges();
}
}
}
然后在ConfigureServices中注册:
services.AddSingleton<ITodoRepository, TodoRepository>();
然后注入到Controller中:
namespace TodoApi.Controllers
{
[Route("api/[controller]")]
public class TodoController : Controller
{
public TodoController(ITodoRepository todoItems)
{
TodoItems = todoItems;
}
public ITodoRepository TodoItems { get; set; }
}
}
作为 ASP.NET Core 1.0 MVC 的新手,我决定为 MVC Core 应用程序使用存储库模式;我正在为数据层 SampleDbContext
使用 SQL 数据库,我想为我的一些业务实体创建一个存储库 class。到目前为止,我已经在 startup.cs
、CustomerController.cs
和 CustomerRepository.cs
文件中完成了以下操作,其中示例实体是 "Customer".
在启动的ConfigureServices
方法中Class:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<SampleDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("SampleDB")));
}
在控制器中:
public class CustomerController : Controller
{
private SampleDBContext _context;
private CustomerRepository = new CustomerRepository (new SampleDBContext());
public CustomerController(SampleDBContext context)
{
_context = context;
}
}
在存储库中:
public class CustomerRepository
{
private SampleDBContext _context;
public CustomerRepository(SampleDBContext context)
{
_context = context;
}
}
通过这种设计,我将 SampleDbContext
作为服务插入 startup.cs
一次,然后对于每个控制器(接收依赖注入)我实例化一个相应的存储库,传递一个新的SampleDbContext
的实例。
数据库上下文的这种重复实例化是多用户环境的良好设计吗?
我想我可以将每个存储库作为服务添加到 startup.cs
,但这看起来不太好。
请告诉我适合我的情况的良好设计实现,或者如果我迷路了,请让我走上正轨。
我不确定这是最好的方法,但我一直将存储库创建为控制器实现的接口。
IRepository.cs:
public interface IRepository
{
SomeList GetSomeList(string userId);
Some GetSomeDetail(int someId);
}
DbInterface.cs:
public class DbInterface : IRepository
{
public SomeList GetSomeList(string userId)
{
}
public Some GetSomeDetail(int someId)
{
}
}
SomeList 是我定义的一种数据类型,其中包含要作为列表显示在页面上的所有属性。 IE。任务应用程序中的任务列表。有些是定义 returns a 任务的详细信息的数据类型(因此输入将是 taskId 等)。
如果这是一个错误的方法,很高兴得到纠正。
有人认为 DbContext 本身是一种存储库模式。如果您想走那条路,可以在 ASP.NET Core and Angular 2.
下载示例代码例如-
public class CustomerController : Controller
{
private SampleDBContext _context;
public CustomerController(SampleDBContext context)
{
_context = context;
}
public async Task<IActionResult> Index(int id)
{
var user = _context.Users.Where(i => i.Id == id).FirstOrDefault();
...
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<SampleDBContext>(options =>
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])
);
}
您可以查看simple example如何使用存储库模式:
您创建存储库接口:
using System.Collections.Generic;
namespace TodoApi.Models
{
public interface ITodoRepository
{
void Add(TodoItem item);
IEnumerable<TodoItem> GetAll();
TodoItem Find(long key);
void Remove(long key);
void Update(TodoItem item);
}
}
然后执行:
using System;
using System.Collections.Generic;
using System.Linq;
namespace TodoApi.Models
{
public class TodoRepository : ITodoRepository
{
private readonly TodoContext _context;
public TodoRepository(TodoContext context)
{
_context = context;
Add(new TodoItem { Name = "Item1" });
}
public IEnumerable<TodoItem> GetAll()
{
return _context.TodoItems.ToList();
}
public void Add(TodoItem item)
{
_context.TodoItems.Add(item);
_context.SaveChanges();
}
public TodoItem Find(long key)
{
return _context.TodoItems.FirstOrDefault(t => t.Key == key);
}
public void Remove(long key)
{
var entity = _context.TodoItems.First(t => t.Key == key);
_context.TodoItems.Remove(entity);
_context.SaveChanges();
}
public void Update(TodoItem item)
{
_context.TodoItems.Update(item);
_context.SaveChanges();
}
}
}
然后在ConfigureServices中注册:
services.AddSingleton<ITodoRepository, TodoRepository>();
然后注入到Controller中:
namespace TodoApi.Controllers
{
[Route("api/[controller]")]
public class TodoController : Controller
{
public TodoController(ITodoRepository todoItems)
{
TodoItems = todoItems;
}
public ITodoRepository TodoItems { get; set; }
}
}