界面多态与DbContext,正确的方法是什么?
有更优雅的方式来实现它吗?
有没有办法直接在存储库中获取dbcontext实例
而不是在控制器和
中获取dbcontext的实例将它一直传递给存储库中的方法?
这就是我现在正在做的事情
第1步 - 控制器
[Route("api/[controller]")]
public class ModulesApiController : Controller
{
private readonly ApplicationDbContext _dbContext;
private readonly ILogger _logger;
public ModulesApiController(ILoggerFactory loggerFactory, **ApplicationDbContext dbContext**)
{
_logger = loggerFactory.CreateLogger<ModulesApiController>();
_dbContext = dbContext;
}
[HttpGet]
[Route("GetModule/{module}")]
public async Task<JsonResult> GetModule(string module)
{
if (ModelState.IsValid)
{
try
{
var ListModules = new List<ImoduleBL>();
ImoduleBL obj = new HomeModuleBL();
if (module == "home-index")
{
//obj = new HomeModuleBL();
//ListModules.Add(obj as ImoduleBL);
//List<Layout> ListObj = await GetModuleService.GetModule(ListModules);
//return Json(ListObj);
}
else if (module == "shop-index")
{
obj = new ShopModuleBL();
ImoduleBL Iobj = obj as ImoduleBL;
return await GetModuleService.GetCateroy(Iobj, _dbContext);
}
else if (module == "top-bunner")
{
}
}
catch (Exception ex)
{
_logger.LogError("Failed of : GetLayOutFor - Index Module", ex);
return null;
}
}
return null;
}
}
第2步 - GetModuleService - 服务
公共类GetModuleService { // _dbContext - 将它一直传递给存储库中的方法
public static async Task<JsonResult> GetCateroy(ImoduleBL ListModules, ApplicationDbContext _dbContext)
{
return await ListModules.GetCateroy(_dbContext);
}
}
第3步 - ShopModuleBL - BL
public class ShopModuleBL : ImoduleBL
{
public async Task<JsonResult> GetCateroy(ApplicationDbContext _dbContext)
{
ImoduleBL ListModules;
ShopModuleRepo obj = new ShopModuleRepo();
ListModules = obj as ImoduleBL;
return await GetModuleService.GetCateroy(ListModules, _dbContext);
}
}
**第4步 - ShopModuleRepo - 存储库**
public class ShopModuleRepo : ImoduleBL
{
public async Task<JsonResult> GetCateroy(ApplicationDbContext _dbContext)
{
return new JsonResult(await _dbContext.Category1s.ToListAsync());
}
}
**第5步 - 客户端 - cs ** 结果传递给角度应用程序.....
谢谢
答案 0 :(得分:0)
你应该使用构造函数注入,而不是方法注入。如您所见,您正在通过每个方法传递db-context-instance,一直到存储库。如果使用构造函数注入,则不必执行此操作。
不幸的是,你正在整个地方新建实例。如果你想使用构造函数注入,那么改变你的设计以使用Inversion Of Control可能是有益的。关于这一点的很多文章,请看一下。
您的存储库将如下所示。
public class ShopModuleRepo : ImoduleBL
{
public ShopModuleRepo(ApplicationDbContext dbContext) {
if (dbContext == null)
throw new ArgumentNullException(nameof(dbContext));
_dbContext = dbContext;
}
private readonly ApplicationDbContext _dbContext;
public async Task<JsonResult> GetCateroy()
{
return new JsonResult(await _dbContext.Category1s.ToListAsync());
}
}
请注意方法GetCateroy
中缺少参数。
现在,您可以从控制器中删除db-context字段,并删除所有其他类中的所有db-context参数。