Nano Hash - криптовалюты, майнинг, программирование

System.InvalidOperationException: невозможно разрешить службу для типа

Я работаю над веб-API с ASP.NET Core. Когда я запускаю свой API с почтовым запросом, перед моей точкой останова в методе Post UnitController возникает исключение.

Исключение

Запрос запуска HTTP/1.1 POST http://localhost:5000/api/unit application/json 31 не выполнен: Microsoft.AspNetCore.Server.Kestrel[13] Идентификатор подключения «0HKVTL9A1LTD4»: приложением было выдано необработанное исключение. System.InvalidOperationException: невозможно разрешить службу для типа «Project.DataAccess.Repository.UnitRepository» при попытке активировать «Project.Service.UnitService».

Контекст

namespace Project.DataAccess.Library.Interface {
public interface IBaseRepository<M> where M : class, IEntity
{
    IEnumerable<M> SelectAll();

    M SelectByID(int id);

    void Insert(M obj);

    void Update(M obj);

    void Delete(int id);

    void Save();
}
}

namespace Project.DataAccess.Library {
public abstract class BaseRepository<M> : IBaseRepository<M> where M : class, IEntity
{
    protected ProjectContext Db { get; }
    private DbSet<M> table = null;

    protected DbSet<M> Table
    {
        get
        {
            return this.table;
        }
    }

    public BaseRepository(ProjectContext dbContext)
    {
        Db = dbContext;
        this.table = Db.Set<M>();
    }

    public void Delete(int id)
    {
        M existing = this.SelectByID(id);
        if (existing != null)
            this.table.Remove(existing);
    }

    // others methods
}
}

namespace Project.DataAccess.Repository
{
    public class UnitRepository : BaseRepository<Unit>, IUnitRepository
    {
        public UnitRepository(Projectcontext) : base(context) { }
    }
}

namespace Project.Service
{
    public class UnitService : BaseService<Unit>, IUnitService
    {
        public UnitService(UnitRepository unitRepository) : base(unitRepository) { }
    }
}


namespace AssoManager.Service.Library
{
    public abstract class BaseService<M> : IBaseService<M> where M : class, IEntity
    {
        private IBaseRepository<M> _repository;

        public BaseService(IBaseRepository<M> repository)
        {
            _repository = repository;
        }

        public IEnumerable<M> GetAll()
        {
            return this._repository.SelectAll();
        }
    }
 }


namespace Project
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }

        public IConfigurationRoot Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddMvc();

            this.DataAccessMySqlConfiguration(services);
            this.ConfigureRepository(services);
            this.ConfigureServicesUnit(services);
            this.ConfigureServicesUser(services);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();

            app.UseMvc();
        }

        #region Database configuration

        public void DataAccessMySqlConfiguration(IServiceCollection services)
        {
            services.AddDbContext<ProjectContext>(options => options.UseMySQL(Configuration.GetConnectionString("MsSQLConnection")));
        }

        #endregion

        #region DataAccess configuration

        public void ConfigureRepository(IServiceCollection services)
        {
            services.AddScoped<IUnitRepository, UnitRepository>();
            services.AddScoped<IUserRepository, UserRepository>();
        }

        #endregion

        #region Services configuration

        /// <summary>
        /// Is used to add unit services to the container
        /// </summary>
        public void ConfigureServicesUnit(IServiceCollection services)
        {
            services.AddTransient<IUnitService, UnitService>();
            services.AddTransient<IMeetingService, MeetingService>();
        }

        /// <summary>
        /// Is used to add user services to the container
        /// </summary>
        public void ConfigureServicesUser(IServiceCollection services)
        {
            services.AddTransient<IUserService, UserService>();
        }

        #endregion Services configuration
    }
}


namespace Project.Controllers
{
    [Route("api/[controller]")]
    public class UnitController : Controller
    {
        private IUnitService UnitService;

        public UnitController(IUnitService unitService)
        {
            UnitService = unitService;
        }

        // GET api/units
        [HttpGet]
        public IEnumerable<Unit> Get()
        {
            return UnitService.GetAll();
        }

        // GET api/unit/5
        [HttpGet("{id}")]
        public IActionResult Get(int id)
        {
            Unit unit;
            //->Check
            if (id < 1)
                return BadRequest();
            //->Processing
            unit = UnitService.GetByID(id);
            if (unit == null)
                return NotFound();
            return new ObjectResult(unit);
        }

        // POST api/unit
        [HttpPost]
        public IActionResult Post([FromBody]Unit unit)
        {
            //->Check
            if (unit == null)
                return BadRequest();
            //->Processing
            UnitService.Create(unit);
            return CreatedAtRoute("Get", new { id = unit.Id }, unit);
        }

        // PUT api/unit/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/unit/5
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }
    }
}

Версия

"dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Mvc": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.EntityFrameworkCore": "1.0.0",
    "MySql.Data.Core": "7.0.4-IR-191",
    "MySql.Data.EntityFrameworkCore": "7.0.4-IR-191",
    "IdentityServer4": "1.0.0-rc2",
    "AssoManager.Domain": "1.0.0-*",
    "AssoManager.Service": "1.0.0-*",
    "AssoManager.DataAccess": "1.0.0-*"
  },

Вопрос

Я думаю, что проблема, возможно, связана с наследованием между BaseRepository и IBaseRepository. Но я не понимаю, где может быть моя ошибка. Как я могу исправить эту ошибку?

Спасибо за помощь :),


Ответы:


1

Вы регистрируете UnitRepository как IUnitRepository, но запрашиваете разрешение IoC UnitRepository. У него нет регистрации для этого, поэтому он терпит неудачу.

Попробуйте заставить UnitService принимать IUnitRepository вместо UnitRepository, это должно решить проблему (простите за каламбур).

26.10.2016
  • Спасибо. Я редактирую свой пост. Написанное исключение не было полным. Извините за это! 26.10.2016

  • 2

    Я нашел ответ Каллума Брэдбери довольно полезным (спасибо, Каллум), но я думаю, что более общий ответ может быть уместен в разных случаях. Так:

    Когда вы используете DI (внедрение зависимостей) в данном классе, а также контейнер IoC (инверсия управления) для управления всеми зависимостями (что не требуется, но это общий случай), вы должны быть уверены, что каждая внедряемая зависимость регистрируется в контейнере, и, возможно, это обычно рекурсивный вопрос.

    Exempli gratia, найдите следующий псевдокод:

    // A class which uses injected dependencies
    class NeedSomeDependeciesToBeInjected
    {
        public NeedSomeDependeciesToBeInjected (
            IThisIsReallyImportant important,
            IThisIsUsefulButNotImportant useful) {}
    }
    
    // A complex dependency, which requires other injected dependency
    // (So, yes, recursion...)
    class ThisIsReallyImportant : IThisIsReallyImportant
    {
        public ThisIsReallyImportant (
            IThisIsRequiredToBecomeImportant required) {}
    }
    
    // A dependency, which does not require other injected dependency,
    // but is required for another dependency
    class ThisIsRequiredToBecomeImportant : IThisIsRequiredToBecomeImportant 
    {
        public ThisIsRequiredToBecomeImportant () {}
    }
    
    // A simple dependency, which does not require other injected dependency,
    // and is not required for others
    class ThisIsUsefulButNotImportant : IThisIsUsefulButNotImportant
    {
        public ThisIsUsefulButNotImportant () {}
    }
    
    class Program
    {
        private readonly WeaponOfChoiceInIoC container;
    
        public void ConfigureDependencies()
        {
            container = new WeaponOfChoiceInIoC();
    
            container.Register(IThisIsRequiredToBecomeImportant,
                ThisIsRequiredToBecomeImportant);
            container.Register(IThisIsReallyImportant,
                ThisIsReallyImportant );
            container.Register(IThisIsUsefulButNotImportant,
                ThisIsUsefulButNotImportant );
        }
    
        public void MethodToPlayWithDependencies()
        {
            var toy = container.GetInstance(NeedSomeDependeciesToBeInjected);
        }
    }
    
    
    04.09.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..