Ошибка Blazor - некоторые службы не могут быть построены - PullRequest
0 голосов
/ 31 января 2020

Создание пользовательского интерфейса с использованием Blazor на стороне сервера в Visual Studio 2019.

У меня есть блок кода, который выглядит следующим образом:

using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;

    namespace ClientsUI.Data
    {
        public class ClientsService
        {
            private readonly ClientsDbContext _context;
            public ClientsService(ClientsDbContext context)
            {
                _context = context;
            }

            private readonly IConfiguration _iconfiguration;
            public ClientsService(IConfiguration iconfiguration)
            {
                _iconfiguration = iconfiguration;
            }

        }
    }

Когда я запускаю отладку, приложение выдает ошибка при CreateHostBuilder методе Startup как таковом:

System.AggregateException: «Некоторые службы не могут быть созданы (Ошибка при проверке дескриптора службы» ServiceType: ClientsUI.Data .ClientsService Lifetime: Scoped PracticeType: ClientsUI.Data.ClientsService ': невозможно активировать тип' ClientsUI.Data.ClientsService '. Следующие конструкторы неоднозначны: Void .ctor (ClientsUI.Data.ClientsDbContext) Void .ctor (Microsoft.Extensions. Configuration.IConfiguration)) '

Я уверен, что это какая-то ошибка noob - когда я закомментирую блок Iconfiguration, все работает нормально. Ясно, что есть проблема с моим синтаксисом - как я могу реализовать оба этих конструктора в этом классе?

«Почему» в вашем ответе будет так же цениться, как и «как», поскольку я нахожусь на своем непрерывном пути обучения.

Ответы [ 2 ]

1 голос
/ 31 января 2020

Почему бы вам не добавить один конструктор, например:

public class ClientsService
        {
            private readonly ClientsDbContext _context;
            private readonly IConfiguration _iconfiguration;

            public ClientsService(ClientsDbContext context, IConfiguration 
                                              iconfiguration)
            {
                _context = context;
                _iconfiguration = iconfiguration;
            }


        }
1 голос
/ 31 января 2020

Как правило, ваш DI-контейнер будет искать конструктор с наибольшим количеством параметров, потому что эта перегрузка определяет наибольшее количество зависимостей, требуемых вашим классом. Причина, по которой у вас не может быть двух конструкторов с одинаковым количеством параметров, заключается в том, что контейнер не может надежно определить, какую перегрузку вы хотите использовать. Контейнер не знает, как будет использоваться класс, только то, что в системе требуется экземпляр этого класса. Если обе перегрузки принимают типы class, то любая из них может принять null в качестве значения. В таких случаях, какую перегрузку следует использовать?

Многие платформы DI позволяют вам выборочно выбирать, какой конструктор вызывать. Вам нужно обратиться к документации вашей платформы, чтобы увидеть, как это происходит. Но в общем случае, когда вы не делаете выборочную конструкцию, поведение по умолчанию состоит в том, чтобы выбрать конструктор с наибольшим количеством параметров.

В этом случае вы можете захотеть go с выборочной конструкцией, если доступный. В противном случае вам, скорее всего, придется реорганизовать код в один конструктор, который принимает два параметра. Это не означает, что ваш код должен использовать оба параметра в любом заданном вызове, но это означает, что контейнер будет пытаться обновить оба параметра, а затем и любые зависимости, требуемые любым из этих параметров ... до конца дерево зависимостей. Если это окажется слишком тяжелым, то вы можете посмотреть ленивую реализацию вашего конкретного фреймворка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...