【问题标题】:Error while trying to inject with services.AddScoped尝试使用 services.AddScoped 注入时出错
【发布时间】:2020-12-31 08:15:33
【问题描述】:

我正在构建一个 WarehouseApi,但是当我尝试注入我的服务时,它给了我一个错误(CS0119)

public static IServiceCollection AddServices(this IServiceCollection services)
        {
            services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
            services.AddScoped(IEmployeeRepository, EmployeeRepository); //CS0119
            return services;
        }

错误描述:EmployeeRepository' 是一种类型,在给定的上下文中无效,并且 IEmployeeRepository' 是一种类型,在给定的上下文中无效

这里是 IEmployeeRepository 和 EmployeeRepository:

public interface IEmployeeRepository : IRepository<Employee>
    {
        Employee GetFirstOrDefaultByFirstName(string firstNameToFind);
        Employee GetFirstOrDefaultByLastName(string lastNameToFind);
        Employee GetFirstOrDefaultbByAge(int ageToFind);
        Employee GetByEmail(string emailToFind);
        Employee GetByAddress(string addressToFind);
        Employee GetByPhoneNumber(string phoneNumberToFind);
    }

public class EmployeeRepository : Repository<Employee>, IEmployeeRepository
    {
        public EmployeeRepository(WareHouseDBContext empContext) : base(empContext) { }

        public Employee GetByAddress(string addressToFind)
        {
            return context.Set<Employee>().FirstOrDefault(x => x.Address == addressToFind);
        }

        public Employee GetByEmail(string emailToFind)
        {
            return context.Set<Employee>().FirstOrDefault(x => x.Email == emailToFind);
        }

        public Employee GetByPhoneNumber(string phoneNumberToFind)
        {
            return context.Set<Employee>().FirstOrDefault(x => x.PhoneNumber == phoneNumberToFind);
        }

        public Employee GetFirstOrDefaultbByAge(int ageToFind)
        {
            return context.Set<Employee>().FirstOrDefault(x => x.Age == ageToFind);
        }

        public Employee GetFirstOrDefaultByFirstName(string firstNameToFind)
        {
            return context.Set<Employee>().FirstOrDefault(x => x.FirstName == firstNameToFind);
        }

        public Employee GetFirstOrDefaultByLastName(string lastNameToFind)
        {
            return context.Set<Employee>().FirstOrDefault(x => x.LastName == lastNameToFind);
        }
    }

我是 API、依赖注入等方面的新手,所以这可能很容易解决

【问题讨论】:

    标签: c# asp.net asp.net-web-api repository-pattern


    【解决方案1】:

    您需要使用接受类型参数的方法来解决编译器警告:

    services.AddScoped<IEmployeeRepository, EmployeeRepository>();
    

    但是,如果您不使用 .NET 5.0 或更高版本,则内置 DI 容器不支持开放泛型 (IFoo&lt;&gt;)。

    在这种情况下,您需要像这样注册它:

    services.AddScoped<IRepository<Employee>, EmployeeRepository>();
    

    .NET 5.0 (PR) 提供对开放泛型的支持。有更多关于它的信息here

    【讨论】:

    • 我试过了,它没有给我任何错误,但它在控制器中不起作用
    • 当我尝试您的方法并进行 API 调用时,它给了我以下错误:System.InvalidOperationException: Unable to resolve service for type 'WareHouseApp.Repository.EmployeeRepositories.EmployeeRepository' while attempting to activate 'WareHouseApp.API.Controllers.EmployeeController'.
    • 你在DI注册WareHouseDBContext了吗?
    • 是的,这个services.AddDbContext&lt;WareHouseDBContext&gt;(options =&gt; options.UseSqlServer(datasource));
    • 尝试更深入地查看异常和/或日志。 DI 系统通常会告诉你为什么它不能激活特定类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2018-09-22
    相关资源
    最近更新 更多