gpt4 book ai didi

c# - 映射器已经初始化

转载 作者:行者123 更新时间:2023-11-30 12:55:29 25 4
gpt4 key购买 nike

我有一个 3 层架构的 Web Api 解决方案,其中包含 3 个项目:数据层、业务层和表示层。我需要在两个业务层和表示层中初始化两个不同的映射器。

我创建了一个静态类和方法来初始化业务逻辑中的一个映射器:

using AutoMapper;
using Shop.BLL.DTOModels;
using Shop.DAL.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Shop.BLL.InitMapper
{
public static class InitializeMapperBLL
{
public static void RegisterMappings()
{
Mapper.Initialize(cfg => cfg.CreateMap<Category, DTOCategoryModel>());
}
}
}

像这样调用它:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Shop.DAL.Repositories;
using AutoMapper;
using Shop.BLL.DTOModels;
using Shop.DAL.Models;
using Shop.BLL.Interfaces;
using Shop.DAL.Interfaces;
using Shop.BLL.InitMapper;

namespace Shop.BLL.Services
{
public class CategoryService : ICategoryService
{
IUnitOfWork Database { get; set; }

public CategoryService(IUnitOfWork uow)
{
Database = uow;
}

public IEnumerable<DTOCategoryModel> GetCategories()
{
//I call it here
InitializeMapperBLL.RegisterMappings();

return Mapper.Map<IEnumerable<Category>, List<DTOCategoryModel>>(Database.Categories.GetAll());
}
public void Dispose()
{
Database.Dispose();
}


}
}

在表示层我做同样的事情:

using AutoMapper;
using Shop.API.ViewModels;
using Shop.BLL.DTOModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Shop.API.MapperInit
{
public static class InitializeMapperAPI
{
public static void RegisterMappings()
{
Mapper.Initialize(cfg => cfg.CreateMap<DTOCategoryModel, CategoryViewModel>());
}
}
}

并调用 Global.asax

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//here I call it
InitializeMapperAPI.RegisterMappings();

CreateKernel();
}

而且我得到了 Mapper already initialized 错误。您必须为每个应用程序域/进程调用一次 Initialize。

如何解决这个问题?

最佳答案

一种方法是使用反射和自动映射器配置文件。这在我使用过的项目中效果很好。

在您的每个项目/图层中创建一个自动映射器配置文件类。每个配置文件类应该只包含它本身需要的 map 。以下是其中一个的示例:

  //Profile here is of type AutoMapper.Profile
public class BusinessLayerMapperConfig : Profile
{
public BusinessLayerMapperConfig()
{
//create layer specific maps
CreateMap<MyObjectDTO, MyObjectViewModel>();
}

public override string ProfileName
{
get { return this.GetType().ToString(); }
}
}

然后在靠近应用程序入口点的地方(我从 Global.asax.cs 中的 ApplicationStart 方法调用以下方法),初始化所有你的个人资料是这样的:

public static void RegisterMaps()
{
//get all projects' AutoMapper profiles using reflection
var assembliesToScan = System.AppDomain.CurrentDomain.GetAssemblies();
var allTypes = assembliesToScan.SelectMany(a => a.ExportedTypes).ToArray();

var profiles =
allTypes
.Where(t => typeof(Profile).GetTypeInfo().IsAssignableFrom(t.GetTypeInfo()))
.Where(t => !t.GetTypeInfo().IsAbstract);

//add each profile to our static AutoMapper
Mapper.Initialize(cfg =>
{
foreach (var profile in profiles)
{
cfg.AddProfile(profile);
}
});
}

这将允许您按使用它们的层在逻辑上分隔您的 map ,并确保您只初始化它们一次。

关于c# - 映射器已经初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49069934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com