c# - 如何在ASP.NET Core中設置Automapper




asp.net-core (7)

我在.NET方面比較新,我決定解決.NET Core問題,而不是學習“老方法”。 我在這裡找到了一篇關於為.NET Core設置AutoMapper的詳細文章,但是對於新手來說,是否有更簡單的演練呢?


Answers

theutz'在這裡的答案是非常好的,我只是想補充一點:

如果讓映射配置文件繼承自MapperConfigurationExpression而不是Profile ,那麼可以非常簡單地添加一個測試來驗證映射設置,這總是很方便:

[Fact]
public void MappingProfile_VerifyMappings()
{
    var mappingProfile = new MappingProfile();

    var config = new MapperConfiguration(mappingProfile);
    var mapper = new Mapper(config);

    (mapper as IMapper).ConfigurationProvider.AssertConfigurationIsValid();
}

添加到Arve Systad提到的測試中。 如果由於某種原因你和我一樣想要維護在theutz解決方案中提供的繼承結構,你可以像這樣設置MapperConfiguration:

var mappingProfile = new MappingProfile();
var config = new MapperConfiguration(cfg =>
{
    cfg.AddProfile(mappingProfile);
});
var mapper = new Mapper(config);

我在NUnit中做了這個。


services.AddAutoMapper(); 沒有為我工作。 (我正在使用Asp.Net Core 2.0)

配置如下

   var config = new AutoMapper.MapperConfiguration(cfg =>
   {                 
       cfg.CreateMap<ClientCustomer, Models.Customer>();
   });

初始化映射器IMapper mapper = config.CreateMapper();

並將該映射器對像作為單例服務添加到服務中。

這樣我可以將DI添加到控制器

  private IMapper autoMapper = null;

  public VerifyController(IMapper mapper)
  {              
   autoMapper = mapper;  
  }

我在我的動作方法中使用了以下內容

  ClientCustomer customerObj = autoMapper.Map<ClientCustomer>(customer);

我想到了! 以下是詳細信息:

  1. 通過NuGet將主要的AutoMapper包添加到您的解決方案中。
  2. 通過NuGet將AutoMapper依賴注入包添加到您的解決方案。
  3. Startup.cs調用AddAutoMapper()擴展,如下所示。

    public void ConfigureServices(IServiceCollection services) {
        // .... Ignore code before this
        services.AddMvc(); // Already included. Add your code below this.
        services.AddAutoMapper(); // <-- This is the line you add.
        // services.AddAutoMapper(typeof(Startup));  // <-- newer automapper version uses this signature.
    }
    
  4. 為映射配置文件創建一個新類。 (我在名為MappingProfile.cs的主解決方案目錄中MappingProfile.cs了一個類,並添加了以下代碼)。我將使用UserUserDto像作為示例。

    public class MappingProfile : Profile {
        public MappingProfile() {
            // Add as many of these lines as you need to map your objects
            CreateMap<User, UserDto>();
            CreateMap<UserDto, User>();
        }
    }
    
  5. 要在代碼中調用映射對象,請執行以下操作:

    public class UserController : Controller {
    
        // Create a field to store the mapper object
        private readonly IMapper _mapper;
    
        // Assign the object in the constructor for dependency injection
        public UserController(IMapper mapper) {
            _mapper = mapper;
        }
    
        public async Task<IActionResult> Edit(string id) {
    
            // Instantiate source object
            // (Get it from the database or whatever your code calls for)
            var user = await _context.Users
                .SingleOrDefaultAsync(u => u.Id == id);
    
            // Instantiate the mapped data transfer object
            // using the mapper you stored in the private field.
            // The type of the source object is the first type argument
            // and the type of the destination is the second.
            // Pass the source object you just instantiated above
            // as the argument to the _mapper.Map<>() method.
            var model = _mapper.Map<User, UserDto>(user);
    
            // .... Do whatever you want after that!
        }
    }
    

我希望這可以幫助開始使用ASP.NET Core的人! 我歡迎任何反饋或批評,因為我還是新來的.NET世界!


我正在使用AutoMapper 6.1.1和asp.net Core 1.1.2。 首先定義Profile類由Automapper繼承的Profile類。 我創建了IProfile接口,它是空的,目的只是找到這種類型的類

 public class UserProfile : Profile, IProfile
    {
        public UserProfile()
        {
            CreateMap<User, UserModel>();
            CreateMap<UserModel, User>();
        }
    }

Now Create a seperate class e.g Mappings 

 public class Mappings
    {
     public static void RegisterMappings()
     {            
       var all =
       Assembly
          .GetEntryAssembly()
          .GetReferencedAssemblies()
          .Select(Assembly.Load)
          .SelectMany(x => x.DefinedTypes)
          .Where(type => typeof(IProfile).GetTypeInfo().IsAssignableFrom(type.AsType()));

            foreach (var ti in all)
            {
                var t = ti.AsType();
                if (t.Equals(typeof(IProfile)))
                {
                    Mapper.Initialize(cfg =>
                    {
                        cfg.AddProfiles(t); // Initialise each Profile classe
                    });
                }
            }         
        }

    }

現在在Startup.cs文件中的MVC Core web Project中,在構造函數調用Mapping類中將會在應用程序加載時初始化所有映射

     Mappings.RegisterMappings();

關於theutz答案,不需要在控制器構造函數中指定IMapper映射參數。

您可以使用Mapper,因為它是代碼中任何位置的靜態成員。

public class UserController : Controller {
   public someMethod()
   {
      Mapper.Map<User, UserDto>(user);
   }
}

現在,asp.mvc項目模板創建一個帳戶控制器,以這種方式獲取用戶管理器:

HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>()

以下適用於我:

ApplicationUser user = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(User.Identity.GetUserId());




c# asp.net-core automapper