【问题标题】:What is the right way to interface polymorphism with DbContext?将多态性与 DbContext 接口的正确方法是什么?
【发布时间】:2017-06-16 13:46:36
【问题描述】:

有没有办法直接在存储库中获取 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 ** Result 传递给 Angular 应用程序.....

谢谢

【问题讨论】:

    标签: .net interface asp.net-core polymorphism dbcontext


    【解决方案1】:

    你应该使用构造函数注入,而不是方法注入。如您所见,您正在通过每个方法传递 db-context-instance,一直到存储库。如果使用构造函数注入,则不必这样做。

    不幸的是,您正在到处更新实例。如果你想使用构造函数注入,改变你的设计以使用控制反转可能是有益的。这方面的文章很多,看看吧。

    您的存储库将如下所示。

    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 参数。

    【讨论】:

    • 感谢 IoC 的意图当然非常有效,但建议我解决同样的问题。我打电话给 ShopModuleRepo - frome ShopModuleBL 像这样: ShopModuleRepo obj = new ShopModuleRepo(); , 请注意,构造函数中没有参数,这就是为什么我会遇到同样的问题
    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多