2017-01-31 6 views
0

интерфейс полиморфизма с DbContext, что такое правильный путь?интерфейс полиморфизма с 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

Вы должны использовать инъекции конструктора, а не метод инъекции. Как вы видите, вы передаете экземпляр 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 во всех других классах.

+0

Благодарим за намерение IoC, конечно, очень эффективно, но с предлагаемым решением я остаюсь с той же проблемой. Я звоню в ShopModuleRepo - frome ShopModuleBL вот так: ShopModuleRepo obj = new ShopModuleRepo(); , Обратите внимание, что в constractor нет параметра, и именно поэтому я остаюсь с той же проблемой – DanielD

Смежные вопросы