映射时无法解析服务类型

Unable to resolve service for type when mapping

我无法将数据从我的模型映射到我的 modelDto(在下面的示例中,由于我工作场所的内部代码实践,它被标记为状态)

然而,当我尝试 运行 编程并调用我的端点时,我收到以下错误:

Unable to resolve service for type 'project1.API.Core.Mappers.Interfaces.IMapToNew`2[Project1.API.Features.Personalisation.Personalisation,Project1.API.Features.Personalisation.Responses.PersonalisationState]' while attempting to activate 'Project1.API.Features.Personalisation.Services.PersonalisationBogusService'.

我认为我映射数据的方式有问题,但我找不到问题所在。我将 post 所有相关 类 进行概述。

public static class ServiceCollectionExtensions
{
public static void GetPersonalisationFeature(this IServiceCollection serviceCollection, IConfiguration config)
{
    config.ThrowIfNull(nameof(config));

    serviceCollection.AddScoped<IPersonalisationService, PersonalisationBogusService>();
}

}

class PersonalisationToPersonalisationState : IMapToNew<Personalisation, PersonalisationState>
{
    public PersonalisationState Map(Personalisation model)
    {
        return new PersonalisationState
        {
            UserType = EnumExtensions.StringToEnum(model.UserType, UserType.Student),
            UserRole = EnumExtensions.StringToEnum(model.UserRole, UserRole.PrimaryGuest),
            BookingPeriod = EnumExtensions.StringToEnum(model.BookingPeriod, BookingPeriod.PreCheckin)
        };
    }
}

public class Personalisation
{
    public string UserType { get; set; }

    public string UserRole { get; set; }

    public string BookingPeriod { get; set; }
}


 public class PersonalisationState
{
    [Description("Get user type based on userID")]
    public UserType UserType { get; set; }
    [Description("Get user role based on userID")]
    public UserRole UserRole { get; set; }
    [Description("Get the booking period of a user based on UserID")]
    public BookingPeriod BookingPeriod { get; set; }
}

public interface IPersonalisationService
{
    Task<IEnumerable<PersonalisationState>> GetPersonalisation(string Id);
}

public class PersonalisationBogusService : IPersonalisationService
{
    private readonly IMapToNew<Personalisation, PersonalisationState> _mapper;


    public PersonalisationBogusService(IMapToNew<Personalisation, PersonalisationState> mapper)
    {
        _mapper = mapper;
    }

    public async Task<IEnumerable<PersonalisationState>> GetPersonalisation(string Id)
    {
        var personalise = GetMockData();
        personalise.Add(GetFakePersonalisedData());
        return personalise
            .Select(b => _mapper.Map(b))

            .Select(b =>
            {
                b.UserType = UserType.Student;
                return b;
            })
            .Select(b =>
            {
                b.UserRole = UserRole.PrimaryGuest;
                return b;
            })
            .Select(b =>
            {
                b.BookingPeriod = BookingPeriod.PreCheckin;
                return b;
            });


    }


    private Personalisation GetFakePersonalisedData()
    {
        return new Personalisation
        {
            UserType = "Student",
            UserRole = "PrimaryGuest",
            BookingPeriod = "01/01/2019"
        };
    }

    public static List<Personalisation> GetMockData()
    {
        return new List<Personalisation> {new Personalisation {UserType = "", UserRole = "", BookingPeriod = ""}};

    }

}

public class PersonalisationController : BaseController
{
    private readonly IPersonalisationService _personalisationService;

    public PersonalisationController(IPersonalisationService personalisationService)
    {
        _personalisationService = personalisationService;
    }


    public async Task<ActionResult> Get([Description("Determines groups a user belongs to via their ID")] string id)
    {
        var result = await _personalisationService.GetPersonalisation(id);
        return Ok(result);
    }

}

是的,我还在startup.cs文件中添加了相关代码:

services.GetPersonalisationFeature(_配置);

目标服务需要 IMapToNew<Personalisation, PersonalisationState> 但基于异常,该类型尚未注册到服务集合。

确保所有依赖类型都添加到服务集合中。

public static class ServiceCollectionExtensions {
    public static void GetPersonalisationFeature(this IServiceCollection serviceCollection, IConfiguration config) {
        config.ThrowIfNull(nameof(config));

        serviceCollection.AddScoped<IMapToNew<Personalisation, PersonalisationState>, PersonalisationToPersonalisationState>();
        serviceCollection.AddScoped<IPersonalisationService, PersonalisationBogusService>();
    }
}

以便在激活依赖时可以解决它们 类。

考虑创建派生类型

public interface IPersonalisationToPersonalisationState 
    : IMapToNew<Personalisation, PersonalisationState> { }

public class PersonalisationToPersonalisationState : IPersonalisationToPersonalisationState {
    //...omitted for brevity
}

更新服务构造函数

public class PersonalisationBogusService : IPersonalisationService {
    private readonly IMapToNew<Personalisation, PersonalisationState> _mapper;


    public PersonalisationBogusService(IPersonalisationToPersonalisationState mapper) {
        _mapper = mapper;
    }

    //...omitted for brevity
}

并确保注册新的抽象

public static class ServiceCollectionExtensions {
    public static void GetPersonalisationFeature(this IServiceCollection serviceCollection, IConfiguration config) {
        config.ThrowIfNull(nameof(config));

        serviceCollection.AddScoped<IPersonalisationToPersonalisationState, PersonalisationToPersonalisationState>();
        serviceCollection.AddScoped<IPersonalisationService, PersonalisationBogusService>();
    }
}