【问题标题】:.NET 7 Error CS0118 'UserService' is a namespace but is used like a type.NET 7 错误 CS0118 \'UserService\' 是一个命名空间,但像类型一样使用
【发布时间】:2022-12-11 09:27:28
【问题描述】:

我的服务位于项目中名为Services 的文件夹下,我已将与用户相关的部分分组在名为UserService 的文件夹中。在该文件夹下,我有一个名为 IUserService.cs 的接口和一个名为 UserService.cs 的类,其中包含基本的用户身份验证方法。

这是文件夹结构的图片:

为了将此用户服务注册到依赖项注入,我使用了一个名为RegisterServices.cs 的扩展方法类。

这是我尝试使用以下代码注册用户服务时遇到的错误:Severity Code Description Project File Line Suppression State Error CS0118 'UserService' is a namespace but is used like a type Infinium.API D:\Infinium Projects\Infinium\Infinium.API\Services\ServiceRegister.cs 16 Active

下面是RegisterServices.cs的代码

using Infinium.API.Authorization;
using Infinium.API.DataManager;
using Infinium.API.Services.UserService;

namespace Infinium.API.Services
{
    public static class ServiceRegister
    {
        public static void RegisterServices(this IServiceCollection services)
        {
            // vNext DB
            services.AddSingleton<IDataAccessor, DataAccessor>();

            //services.Configure<AppSettings>(getser)
            services.AddScoped<IJwtUtils, JwtUtils>();
            services.AddScoped<IUserService, UserService>();

        }
    }
}

我已将 RegisterServices 扩展方法类添加到 Program.cs,如下所示;

using Infinium.API.Authorization;
using Infinium.API.Helpers;
using Infinium.API.Services;
using MaxRAV.API.Helpers;
using Serilog;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddCors(options =>
{
    options.AddPolicy(name: "AllowedCorsOrigins",
builder =>
{
    builder
.SetIsOriginAllowed((_) => true)
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// configure strongly typed settings object
builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings"));

builder.Services.RegisterServices();

builder.Host.UseSerilog((ctx, lc) => lc
    .WriteTo.Console()
    .WriteTo.Seq("http://localhost:5341") // comment if not configired
    );

var app = builder.Build();

app.UseCors("AllowedCorsOrigins");


// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

// global error handler
app.UseMiddleware<ErrorHandlerMiddleware>();

// custom jwt auth middleware
app.UseMiddleware<JwtMiddleware>();

//app.UseAuthorization();

app.MapControllers();

app.Run();

用于 .NET 5 和 .NET 6 的相同代码有时会引发此错误。我假设文件夹名称与类名称冲突,但我不确定为什么它不会一直发生。 也许解决方案是重命名文件夹?

【问题讨论】:

    标签: c# dependency-injection visual-studio-2022 .net-7.0 c#-11.0


    【解决方案1】:

    有多种方法可以处理这个问题,例如使用完全限定的类型名称,例如

    services.AddScoped<Infinium.API.Services.UserService.IUserService, 
                       Infinium.API.Services.UserService.UserService>();
    

    名称空间名称与类名称冲突有时会导致此类问题。

    另一个想法是保持它们之间的分离,这样如果您的命名空间以 UserService 结尾,则该类具有不同的名称。一个建议是让命名空间以你所拥有的任何东西的复数形式结尾,比如

    Infinium.API.Services.UserServices
    

    命名空间中的类名是

    UserService
    

    或者,您可以使用 typeof 运算符来指定 UserService 类的类型,如下所示

    public static class RegisterServices
    {
        public static void AddUserService(this IServiceCollection services)
        {
            services.AddScoped<IUserService, typeof(UserService)>();
        }
    }
    

    【讨论】:

    • 感谢@Wiktor Zychla 的回答。我想到了复数命名空间,因为它比使用完整路径更容易。仍然不确定为什么 IntelliSense 不总是将此名称冲突标记为问题。自 .NET 5 以来发生了什么变化?
    • 这不是一个新问题,我什至怀疑 .NET7 没有改变任何东西。您的大部分应用程序仍在 4.7.2 上,我们偶尔会遇到这个问题。多元化是解决这个问题的最优选方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 2021-03-31
    • 2018-03-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多