代码之家  ›  专栏  ›  技术社区  ›  Xeevis

如何从IRouter访问存储库

  •  0
  • Xeevis  · 技术社区  · 7 年前

    我正在开发模块化应用程序,我希望来自不同模块的实体能够注册自己的友好url段塞。

    app.UseMvc(routes =>
    {
        routes.Routes.Add(new SlugRouter(routes.DefaultHandler));
        (...)
    });
    

    但是下面的代码抛出 无法访问已释放的对象。对象名称:“CommerceDbContext”。 尝试从存储库访问slug时。

    public class SlugRouter : IRouter
    {
        private readonly IRouter _target;
    
        public SlugRouter(IRouter target)
        {
            _target = target;
        }
    
        public async Task RouteAsync(RouteContext context)
        {
            var slugRepository = context.HttpContext.RequestServices.GetService<IRepository<SlugEntity>>();
    
            // ERROR: Cannot access a disposed object. Object name: 'CommerceDbContext'
            var urlSlug = await slugRepository.GetAllIncluding(x => x.EntityType).FirstOrDefaultAsync(x => x.Slug == context.HttpContext.Request.Path.Value);
            (...)
        }       
    

    要从路由器访问存储库,我必须缺少一些简单的东西。谢谢你的帮助。

    2 回复  |  直到 7 年前
        1
  •  1
  •   aaron    7 年前

    开始a unit of work :

    public async Task RouteAsync(RouteContext context)
    {
        var slugRepository = context.HttpContext.RequestServices.GetService<IRepository<SlugEntity>>();
        var unitOfWorkManager = context.HttpContext.RequestServices.GetService<IUnitOfWorkManager>();
    
        using (var uow = unitOfWorkManager.Begin())
        {
            var urlSlug = await slugRepository.GetAllIncluding(x => x.EntityType).FirstOrDefaultAsync(x => x.Slug == context.HttpContext.Request.Path.Value);
            await uow.CompleteAsync();
        }
    }
    
        2
  •  0
  •   Roman Pokrovskij Archil Labadze    7 年前

    访问IModel。您不需要的dbContext。

    来自不同模块的实体能够注册自己的 友好url段塞

    我这样做:

    1) 将OnModelCreating移动到静态方法

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            BuildModel(modelBuilder);
        }
    
        public static void BuildModel(ModelBuilder modelBuilder)
        {
            // ...
        }
    

    2) 在需要的地方创建模型:

            var conventionSet = new ConventionSet();
            var modelBuilder = new ModelBuilder(conventionSet);
            AdminkaDbContext.BuildModel(modelBuilder);
            var mutableModel = modelBuilder.Model; 
    

    这是您的元(在mutableModel中)。可以循环实体(实体类型)。