如何在ASP.NET Core MVC中设计具有dependency injection的存储库模式?

作为ASP.NET Core 1.0 MVC的新手,我决定将一个Repository Pattern用于MVC Core应用程序; 我正在使用SQL DB作为数据层SampleDbContext ,我希望为我的一些业务实体提供一个Repository类。 到目前为止,我在startup.csCustomerController.csCustomerRepository.cs文件中完成了以下操作,其中示例实体是“Customer”。

在Startup类的ConfigureServices方法中:

 public void ConfigureServices(IServiceCollection services) { services.AddDbContext(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 ,然后对于每个Controller(接收dependency injection),我实例化一个相应的Repository,传递SampleDbContext一个新实例。 DB环境的重复实例化是多用户环境的良好设计吗? 我想我可以将每个Repository作为服务添加到startup.cs但这看起来不太好。 请告诉我一个好的设计实现我的情况,或者如果我迷路了就把我放在正确的轨道上。

您可以看到如何使用存储库模式的简单示例 :

您创建存储库接口:

 using System.Collections.Generic; namespace TodoApi.Models { public interface ITodoRepository { void Add(TodoItem item); IEnumerable 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 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(); 

然后将其注入Controller:

 namespace TodoApi.Controllers { [Route("api/[controller]")] public class TodoController : Controller { public TodoController(ITodoRepository todoItems) { TodoItems = todoItems; } public ITodoRepository TodoItems { get; set; } } } 

有人认为DbContext本身就是一个存储库模式。 如果您想要使用该路径,可以在ASP.NET Core和Angular 2下载示例代码。

例如 –

 public class CustomerController : Controller { private SampleDBContext _context; public CustomerController(SampleDBContext context) { _context = context; } public async Task Index(int id) { var user = _context.Users.Where(i => i.Id == id).FirstOrDefault(); ... } } 

Startup.cs

 public void ConfigureServices(IServiceCollection services) { services.AddDbContext(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]) ); } 

我不确定它是最好的方法,但我总是将存储库创建为控制器实现的接口。

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是我定义的数据类型,其中所有属性都作为列表显示在页面上。 即任务应用程序中的任务列表。 有些是定义的数据类型,它返回任务的详细信息(因此输入将是taskId等)。

如果这是一个糟糕的方法,很高兴得到纠正。