代码之家  ›  专栏  ›  技术社区  ›  Uladz Kha

如何将AutoMapper添加到DI in。Net core 2.0控制台应用程序

  •  4
  • Uladz Kha  · 技术社区  · 7 年前

    我尝试使用 AutoMapper 在我的。Net Core 2.0控制台应用程序。我的班级是这样的:

    public class AutoGetCurrency
    {
        private readonly IMapper mapper;
        public AutoGetCurrency(IMapper mapper) {
        this.mapper = mapper;
        }
        ....
    }
    

    我试图将服务添加到 主要的 方法:

    static void Main(string[] args)
    {
        var services = new ServiceCollection();
        ServiceProvider = services.BuildServiceProvider();
        services.AddTransient<IMapper>();
        ....
    }
    

    但我有下一个错误 '发生了一个或多个错误。(对象引用未设置为对象的实例。)'

    请告诉我如何添加AutoMapper以使用DI。

    3 回复  |  直到 7 年前
        1
  •  10
  •   Kahbazi    7 年前

    您需要添加此nuget包 AutoMapper.Extensions.Microsoft.DependencyInjection 添加到项目并添加 AutoMapper 到您的 ServiceCollection 这样地

    var services = new ServiceCollection();
    services.AddAutoMapper(mapperConfig => mapperConfig.AddProfiles(GetType().Assembly))
    ServiceProvider = services.BuildServiceProvider();
    
        2
  •  4
  •   Iman Bahrampour    6 年前

    安装“AutoMapper”和“Microsoft”。扩展。NuGet的DependencyInjection包。

    实现User和UserDTO类,以便从User映射到UserDTO:

    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    public class UserDTO
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    

    实现用于执行映射操作的接口和类,如下所示(不要忘记使用AutoMapper):

    public interface ICustomMapper<T>
    {
        T MapUserToUserDTO();
    }
    public class CustomMapper : ICustomMapper<UserDTO>
    {
        private readonly IMapper mapper;
        public CustomMapper(IMapper mapper) =>
            this.mapper = mapper;
        public UserDTO MapUserToUserDTO()
        {
            User user = new User()
            {
               Id = 5,
               Name = "Iman"
            };
            UserDTO userDTO = mapper.Map<UserDTO>(user);
            return userDTO;
        }
    }
    

    之后,创建一个RegisterServices方法,用于在项目中进行依赖项注入,并创建一个DisposeServices方法,用于处理服务提供者。

    using AutoMapper;
    using Microsoft.Extensions.DependencyInjection;
    
    namespace AutoMapperProject
    {
        class Program
        {
            private static IServiceProvider _serviceProvider;
            static void Main(string[] args)
            {
                RegisterServices();
                ICustomMapper<UserDTO> service = 
                _serviceProvider.GetService<ICustomMapper<UserDTO>>();
                UserDTO userDTO = service.MapUserToUserDTO();
                DisposeServices();
                Console.WriteLine("Hello AutoMapper!");
            }
            private static void RegisterServices()
            {
                var collection = new ServiceCollection();
                collection.AddAutoMapper(typeof(Program));
                collection.AddScoped<ICustomMapper<UserDTO>, CustomMapper>();
                // ...
                // Add other services
                // ...
                _serviceProvider = collection.BuildServiceProvider();
            }
            private static void DisposeServices()
            {
               if (_serviceProvider == null)
               {
                  return;
               }
               if (_serviceProvider is IDisposable)
               {
                  ((IDisposable)_serviceProvider).Dispose();
               }
            }
        }
    }
    

        3
  •  0
  •   Anthony Giretti    7 年前

    您需要映射一个实现IMapper的具体类。

    http://automapper.readthedocs.io/en/latest/Dependency-injection.html

    但情况是这样的: services.AddTransient<IMapper,YourconcreteClass>();