【发布时间】:2018-08-20 09:17:52
【问题描述】:
我想创建包含以下扩展方法的 .Net Core 类库:
public static class MyServiceExtensions
{
public static IServiceCollection AddMyService<TUserDto, TUserDtoKey, TUser, TUserKey>(this IServiceCollection services)
where TUserDto : UserDto<TUserDtoKey>
where TUser : User<TUserKey>
{
services.AddAutoMapper(config =>
{
config.AddProfile<UserMappingProfile<TUserDto, TUserDtoKey, TUser, TUserKey>>();
});
return services;
}
}
我有以下 Automapper 配置文件:
public class UserMappingProfile<TUserDto, TUserDtoKey, TUser, TUserKey> : Profile
where TUserDto : UserDto<TUserDtoKey>
where TUser : User<TUserKey>
{
public UserMappingProfile()
{
CreateMap<TUserDto, TUser>(MemberList.Destination)
.ForMember(x => x.Id, opts => opts.MapFrom(x => x.UserId));
CreateMap<TUser, TUserDto > (MemberList.Source)
.ForMember(x => x.UserId, opts => opts.MapFrom(x => x.Id));
}
}
这些实体:
public class UserDto<TKey>
{
public TKey UserId { get; set; }
public string UserName { get; set; }
}
public class User<TKey>
{
public TKey Id { get; set; }
public string UserName { get; set; }
}
public class MyUser : User<int>
{
public string Email { get; set; }
}
public class MyUserDto : UserDto<int>
{
public string Email { get; set; }
}
如果我尝试这样使用它:
services.AddMyService<MyUserDto, int, MyUser, int>();
我收到此错误:
{System.ArgumentException: 无法创建实例 GenericMapping.Services.Mapping.UserMappingProfile
4[TUserDto,TUserDtoKey,TUser,TUserKey] because Type.ContainsGenericParameters is true. at System.RuntimeType.CreateInstanceCheckThis() at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean wrapExceptions, Boolean skipCheckThis, Boolean fillCache) at System.Activator.CreateInstance(Type type, Boolean nonPublic, Boolean wrapExceptions) at AutoMapper.Configuration.MapperConfigurationExpression.AddProfile(Type profileType) in C:\projects\automapper\src\AutoMapper\Configuration\MapperConfigurationExpression.cs:line 44 at AutoMapper.ServiceCollectionExtensions.<>c__DisplayClass10_0.<AddAutoMapperClasses>g__ConfigAction|4(IMapperConfigurationExpression cfg) in C:\projects\automapper-extensions-microsoft-dependencyinjectio\src\AutoMapper.Extensions.Microsoft.DependencyInjection\ServiceCollectionExtensions.cs:line 83 at AutoMapper.MapperConfiguration.Build(Action1 配置)中 C:\projects\automapper\src\AutoMapper\MapperConfiguration.cs:307 行 在 AutoMapper.ServiceCollectionExtensions.AddAutoMapperClasses(IServiceCollection 服务,行动1 additionalInitAction, IEnumerable1 组件ToScan)在 C:\projects\automapper-extensions-microsoft-dependencyinjectio\src\AutoMapper.Extensions.Microsoft.DependencyInjection\ServiceCollectionExtensions.cs:line 89 在 GenericMapping.Services.Extensions.MyServiceExtensions.AddMyService[TUserDto,TUserDtoKey,TUser,TUserKey](IServiceCollection 服务)在 C:\Projects\GenericMapping\GenericMapping.Services\Extensions\MyServiceExtensions.cs:line 14 在 GenericMapping.Startup.ConfigureServices(IServiceCollection 服务)在 C:\Projects\GenericMapping\GenericMapping\Startup.cs:line 33}
我该如何解决这个问题?
【问题讨论】:
-
AM 支持 SourceLink,因此应该很容易通过代码来了解发生了什么。
标签: c# asp.net-core .net-core automapper