gpt4 book ai didi

c# - 如何在 ASP.NET Core MVC 中使用依赖注入(inject)设计存储库模式?

转载 作者:IT王子 更新时间:2023-10-29 04:42:44 26 4
gpt4 key购买 nike

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

在启动类的ConfigureServices方法中:

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

在 Controller 中:

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 (接收依赖注入(inject))实例化一个相应的存储库传递 SampleDbContext 的新实例。数据库上下文的这种重复实例化是多用户环境的良好设计吗?我想我可以将每个存储库作为服务添加到 startup.cs 但这看起来不太好。请为我的案例告诉我一个好的设计实现,或者如果我迷路了,请让我走上正轨。

最佳答案

可以看到simple example如何使用存储库模式:

您创建存储库接口(interface):

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>();

然后注入(inject)到Controller中:

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

关于c# - 如何在 ASP.NET Core MVC 中使用依赖注入(inject)设计存储库模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42356411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com