Я пытаюсь сделать REST API с помощью учебника на YouTube, но у меня есть следующая ошибка:
Ошибка CS0121 Неоднозначный вызов между следующими методами или характеристики: 'Application.Dependency.AddApplication(Microsoft.Extensions.DependencyInjection.IServiceCollection)' и 'Application.Dependency.AddApplication(Microsoft.Extensions.DependencyInjection.IServiceCollection)'
Я понимаю, что у меня 2 одинаковых метода и он не понимает, какой из них выбрать, но я не могу понять, почему возникает эта ошибка и как ее исправить.
Файл Application.Dependency.cs:
using Application.Services.Authentication;
using Microsoft.Extensions.DependencyInjection;
namespace Application;
public static class Dependency {
public static IServiceCollection AddApplication(this IServiceCollection services)
{
services.AddScoped<IAuthenticationService, AuthenticationService>();
return services;
}
}
Программа.cs:
using Infrastructure;
using Application;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
{
builder.Services.AddApplication().AddInfrastructure();
builder.Services.AddControllers();
}
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Хм, я думаю, что видел похожую (если не такую же) ошибку, вызванную ссылками на несколько версий одного и того же пакета nuget. Проверяйте каждый проект и на какие пакеты и версии ссылаются
@JonSkeet Да, но я не могу найти, где метод 2
А, значит, когда вы говорите «Я понимаю, что у меня есть 2 одинаковых метода», вы имеете в виду, что на самом деле не знаете, где они находятся. Предположительно, вы можете найти один из них. Если вы переименуете его в «AddApplicationTemp», а затем вернетесь в Program.cs, поместите курсор в AddApplication, а затем нажмите F12 (перейти к члену), что произойдет?
@JonSkeet Ошибка изменяется на Error CS1061 «IServiceCollection» не содержит определения для «AddApplication», и не может быть найден доступный метод расширения «AddApplication», принимающий первый аргумент типа «IServiceCollection» (вы пропустили директиву using или сборку ссылка?) когда я переименовываю свой метод, при нажатии F12 ничего не происходит, я пытаюсь использовать поиск визуальной студии в файлах, и у меня есть только 1 метод AddApplication()
Интересный. Если вы измените код вызова на вызов .AddApplicationTemp()
, вы снова получите две ошибки? Если это так, похоже, что код каким-то образом включается дважды. Пожалуйста, опубликуйте файл вашего проекта (в вопросе), так как он может иметь ответ.
Нет, если я сделаю так, у меня будет та же ошибка. Вызов неоднозначен.
@JonSkeet Я добавляю ссылку на репозиторий кода
Проблема в том, как ваши проекты организованы в файловой системе.
У вас есть BublerProject.csproj
в каталоге, который сам содержит все ваши другие проекты. Это означает, что все файлы C# компилируются в BublerProject
и в других проектах, что и вызывает конфликт.
Вместо этого было бы лучше иметь такую структуру каталогов:
- BublerSolution
|
+- BublerSolution.sln
|
+- BublerProject
|
+- BublerProject.csproj
+- Program.cs (etc)
|
+- Application
|
+- Application.csproj
+- Dependency.cs
+- ... (other projects)
Другими словами, ваш каталог верхнего уровня содержит только файл решения и подкаталог для каждого проекта. Таким образом, вы никогда не вложите один проект в другой.
К сожалению, Visual Studio может легко создать проект и решение рядом друг с другом, что приводит к такой ситуации. Если вы всегда начинаете с нового решения, а затем добавляете к нему проекты (вместо того, чтобы начинать с нового проекта и сохранять из него решение), то обычно этого можно избежать.
"но я не могу понять, почему возникает эта ошибка и как ее исправить" - предположительно это происходит из-за того, что у вас есть два одинаковых метода, и чтобы исправить это, вы должны избавиться от одного из них. В какой части руководства предлагалось использовать два одинаковых метода?