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

AspNetCore-无法解析类型X的服务

  •  0
  • BeniaminoBaggins  · 技术社区  · 4 年前

    启动Asp时出现此错误。Net Core Mvc web app:

    “无法构造某些服务(验证时出错 服务描述符的服务类型: Vepo。应用IAddVeganItemToAppluseCase生存期:瞬态 实现类型:Vepo。应用AddVeganItemToAppluseCase:无法 解析类型的服务 'Vepo。数据GroceryItemGroceryStoresRepository“试图 激活“Vepo”。应用添加veganitemtoappusecase“”)"

    因此,这一部分似乎是罪犯:

    无法解析“Vepo”类型的服务。数据GroceryItemGroceryStoresRepository’。

    在我的创业中。cs我有这个:

    services.AddScoped(typeof(IGroceryItemGroceryStoresRepository), typeof(GroceryItemGroceryStoresRepository));
    services.AddTransient<IAddVeganItemToAppUseCase, AddVeganItemToAppUseCase>(); 
    

    这有什么问题吗?

    以下是所有相关代码:

    i假设。反恐精英

    using System.Collections.Generic;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    
    namespace Vepo.Data
    {
        public interface IRepository<EntityType, IdType>
        {
            Task<EntityType> Save(EntityType entity);
            EntityType Fetch(IdType id);
            IEnumerable<EntityType> FetchAll();
            bool EntityExists(IdType id);
        }
    }
    

    一种积极的态度。反恐精英

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.EntityFrameworkCore;
    using Vepo.Common.Utilities;
    using Vepo.DataContext;
    using Vepo.Domain;
    
    namespace Vepo.Data
    {
        [Serializable]
        public abstract class ARepository<EntityType, IdType> : IRepository<EntityType, IdType> where EntityType : ADomainEntity<IdType>
        {
            protected readonly VepoContext context;
            protected DbSet<EntityType> entities;
            protected string errorMessage = string.Empty;
            public ARepository(VepoContext context)
            {
                this.context = context;
                entities = context.Set<EntityType>();
            }
    
            public bool Compare<T>(T x, T y)
            {
                return EqualityComparer<T>.Default.Equals(x, y);
            }
    
            public virtual async Task<EntityType> Save(EntityType entity)
            {
                if (entity == null)
                {
                    throw new ArgumentNullException("entity");
                }
                if (NumberUtilities.IsNumber(entity.Id))
                {
                    if (Convert.ToInt32(entity.Id) > 0)
                    {
                        await context.SaveChangesAsync();
                    } else {
                        await entities.AddAsync(entity);
                        await context.SaveChangesAsync();
                    }
                }
                return entity;
            }
    
            public EntityType Fetch(IdType id)
            {
                return entities.SingleOrDefault(s => Compare<IdType>(s.Id, id));
            }
    
            public IEnumerable<EntityType> FetchAll()
            {
                return entities.AsEnumerable();
            }
    
            public void Delete(EntityType entity)
            {
                if (entity == null)
                {
                    throw new ArgumentNullException("entity");
                }
                entities.Remove(entity);
                context.SaveChanges();
            }
            public void Remove(EntityType entity)
            {
                if (entity == null)
                {
                    throw new ArgumentNullException("entity");
                }
                entities.Remove(entity);
            }
    
            public void SaveChanges()
            {
                context.SaveChanges();
            }
    
            public virtual bool EntityExists(IdType id)
            {
                return entities.Any(e => Compare<IdType>(e.Id, id));
            }
        }
    }
    

    IGroceryItemGroceryStoresRepository。反恐精英:

    using Vepo.Domain;
    
        namespace Vepo.Data
        {
            public interface IGroceryItemGroceryStoresRepository : IRepository<GroceryItemGroceryStore, int>
            {
                
            }
        }
    

    GroceryItemGroceryStoresRepository食品杂货店。反恐精英

    using System;
    using Microsoft.EntityFrameworkCore;
    using Vepo.DataContext;
    using Vepo.Domain;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace Vepo.Data
    {
        public class GroceryItemGroceryStoresRepository : ARepository<GroceryItemGroceryStore, int>, IGroceryItemGroceryStoresRepository
        {
            public GroceryItemGroceryStoresRepository(VepoContext context) : base(context)
            {
            }
    
            public override bool EntityExists(int id)
            {
                return context.GroceryItemGroceryStores.Any(e => e.VeganItemId == id);
            }
    
            public async override Task<GroceryItemGroceryStore> Save(GroceryItemGroceryStore entity)
            {
                ++entity.VeganItem.CurrentRevisionId;
    
                var toReturnVeganItem = entity.VeganItem;
                var toReturnEstablishment = entity.Establishment;
                
                context.GroceryItems.Add(entity.VeganItem);
                context.SaveChanges();
                
                context.Set<GroceryStore>().AddIfNotExists(entity.Establishment , x => x.PlaceId == entity.Establishment.PlaceId);
                context.SaveChanges();
    
                var establishmentId = context.GroceryStores.Single(a => a.PlaceId == entity.Establishment.PlaceId).Id;
                var veganItemId = context.GroceryItems.Single(a => a.Brand == entity.VeganItem.Brand && a.Name == entity.VeganItem.Name).Id;
                
                toReturnEstablishment.Id = establishmentId;
                toReturnVeganItem.Id = veganItemId;
                entity.VeganItemId = veganItemId;
                entity.EstablishmentId = establishmentId;
                
                entity.VeganItem = null;
                entity.Establishment = null;
    
                context.Set<GroceryItemGroceryStore>().AddIfNotExists(entity , x => x.VeganItemId == veganItemId && x.EstablishmentId == establishmentId);
                
                try
                {
                    await context.SaveChangesAsync();
                }
                catch (DbUpdateException)
                {
                    if (EntityExists(entity.VeganItemId))
                    {
                        throw;
                    }
                    else
                    {
                        throw;
                    }
                }
    
                entity.VeganItem = toReturnVeganItem;
    
                entity.Establishment = toReturnEstablishment;
                return entity;
            }
        }
    }
    

    IADDVEGANITEM应用用例。反恐精英

    using System.Threading.Tasks;
    using Vepo.Domain;
    
    namespace Vepo.Application
    {
        public interface IAddVeganItemToAppUseCase
        {
            Task<GroceryItemGroceryStore> Invoke(GroceryItemGroceryStore entity);
        }
    }
    

    添加veganitemtoappusecase。反恐精英

    using System.Threading.Tasks;
    using Vepo.Data;
    using Vepo.Domain;
    
    namespace Vepo.Application
    {
        public class AddVeganItemToAppUseCase : IAddVeganItemToAppUseCase
        {
            private GroceryItemGroceryStoresRepository repository;
    
            public AddVeganItemToAppUseCase(GroceryItemGroceryStoresRepository repository)
            {
                this.repository = repository;
            }
    
            public Task<GroceryItemGroceryStore> Invoke(GroceryItemGroceryStore entity)
            {
                return repository.Save(entity);
            }
        }
    }
    

    启动。反恐精英

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.EntityFrameworkCore;
    using System.Text.Json.Serialization;
    using Vepo.Domain;
    using Vepo.DataContext;
    using System;
    using Vepo.Data;
    using Vepo.Application;
    
    namespace Vepo.Web
    {
        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            public void ConfigureServices(IServiceCollection services)
            {
                services
                .AddDbContext<VepoContext>(opt =>
                    opt
                    .UseNpgsql(
                        Configuration
                        .GetConnectionString("DefaultConnection"))
                        .EnableSensitiveDataLogging()
                        .EnableDetailedErrors()
                        .LogTo(Console.WriteLine));
                services.AddControllers().AddJsonOptions(opt =>
                {
                    opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
                });
    
                services.AddControllers().AddNewtonsoftJson(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
    
                services.AddMvc().AddJsonOptions(options =>
                {
                    options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
                });
    
                services.AddScoped(typeof(IGroceryItemGroceryStoresRepository), typeof(GroceryItemGroceryStoresRepository));
                services.AddTransient<IAddVeganItemToAppUseCase, AddVeganItemToAppUseCase>(); 
                services.AddSwaggerGen();
            }
    
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseHttpsRedirection();
                app.UseRouting();
    
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                });
    
                app.UseSwagger();
                app.UseSwaggerUI(c =>
                {
                    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My Test1 Api v1");
                });
            }
        }
    }
    
    2 回复  |  直到 4 年前
        1
  •  2
  •   msmolcic    4 年前

    您正在注册 GroceryItemGroceryStoresRepository 作为类型的接口 IGroceryItemGroceryStoresRepository ,但你有 GroceryItemGroceryStoresRepository食品杂货店 注入到 AddVeganItemToAppUseCase . 在 添加veganitemtoappusecase 从具体类型到其相应的接口注册,它应该工作。

    public class AddVeganItemToAppUseCase : IAddVeganItemToAppUseCase
    {
        private IGroceryItemGroceryStoresRepository repository;
    
        public AddVeganItemToAppUseCase(IGroceryItemGroceryStoresRepository repository)
        {
            this.repository = repository;
        }
    
        public Task<GroceryItemGroceryStore> Invoke(GroceryItemGroceryStore entity)
        {
            return repository.Save(entity);
        }
    }
    
    推荐文章