我已升级到最新版本的 AutoMapper (9.0),并将静态配置更改为:
public static IMapper RegisterAutoMapper()
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<MyModel MyDto>;
//etc...
});
var mapper = config.CreateMapper();
return mapper;
}
使用之前的静态 API,我曾经在
Global.asax
中执行以下操作:
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
AutoMapping.Map();
}
WebApiConfig.Register
注册路线,还Autofac
如何向 Autofac 注册 AutoMapper,因为目前我在此类行上遇到编译器错误:
var myDto = Mapper.Map<MyModel>(model);
编译器错误:
非静态字段、方法或属性“Mapper.Map(object)”需要对象引用
这是我之前做的:
public class YourAutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
//Also register any custom type converter/value resolvers
builder.RegisterType<CustomValueResolver>().AsSelf();
builder.RegisterType<CustomTypeConverter>().AsSelf();
builder.Register(context => new MapperConfiguration(cfg =>
{
cfg.CreateMap<MyModel MyDto>;
//etc...
})).AsSelf().SingleInstance();
builder.Register(c =>
{
//This resolves a new context that can be used later.
var context = c.Resolve<IComponentContext>();
var config = context.Resolve<MapperConfiguration>();
return config.CreateMapper(context.Resolve);
})
.As<IMapper>()
.InstancePerLifetimeScope();
}
}
在global.asax.cs中
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
var builder = new ContainerBuilder();
builder.RegisterModule<MyAutofacModule>();
// Register anything else needed
var container = builder.Build();
// MVC resolver
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
// API Resolver
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
}
然后你需要做的就是注入IMapper
还有一个 nuget-package 可以为您完成所有这些工作。
您需要做的就是在
ContainerBuilder
上调用扩展方法并传入程序集,应该扫描 AutoMapper 类型。
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterAutoMapper(typeof(MvcApplication).Assembly);
// more registrations here
您可以在这里找到它。您也可以在 AutoMapper docs 中找到官方示例。
编辑: 这里有 ASP.NET Core 和控制台应用程序的示例。
AutoMapper
-https://www.nuget.org/packages/AutoMapper/9.0.0
Autofact
-https://www.nuget.org/packages/Autofac/6.4.0
Autofact.WebAPI2
-https://www.nuget.org/packages/Autofac.WebApi2/6.1.1
// Global.asax
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
AutofacConfig.RegisterComponents(); // IoC, AUTOFAC
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Autofact 配置#region MAPPING
// AutofacConfig.cs
public static class AutofacConfig
{
public static void RegisterComponents()
{
var builder = new ContainerBuilder();
// Get your HttpConfiguration.
var config = GlobalConfiguration.Configuration;
// Register your Web API controllers.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// OPTIONAL: Register the Autofac filter provider.
builder.RegisterWebApiFilterProvider(config);
// OPTIONAL: Register the Autofac model binder provider.
builder.RegisterWebApiModelBinderProvider();
#region MAPPING
// 1 - Mapper configuration is done here
// Notice the AutoMapperProfile instantiation
var mapperConfiguration = new MapperConfiguration(cfg => { cfg.AddProfile(new AutoMapperProfile()); });
// 2 - After configuring the mapper, you create it
var mapper = mapperConfiguration.CreateMapper();
// 3 - Register that instance of the mapper, which implements IMapper interface
builder.RegisterInstance<IMapper>(mapper);
// 4 - Now you register the TestMapper that you'll inject somewehre in your code, let's say, in a controller
// Register as many mappers as you need
builder.Register(c => new TestMapper(c.Resolve<IMapper>())).As<ITestMapper>();
#endregion
// Set the dependency resolver to be Autofac.
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
}
自动映射器简介Profile
命名空间扩展了
AutoMapper
。
AutoMapperProfile
的实际配置。
AutofacConfig.cs
调用的文件
// AutoMapperProfile.cs
public class AutoMapperProfile : Profile
{
public AutoMapperProfile()
{
CreateMap<Test, TestDto>()
.ForMember(destination => destination.Floating, options => options.MapFrom(source => source.flotante))
.ForMember(dto => dto.Integer, opt => opt.MapFrom(src => src.entero))
;
// Test is a model/entity from the DB
// TestDto is a class I use as a Data Transfer Object
}
}
测试映射器TestMapper
的地方。
ITestMapper
是您的自定义定义。
// TestMapper.cs
public class TestMapper : ITestMapper
{
IMapper _mapper;
public TestMapper(IMapper mapper)
{
_mapper = mapper;
}
public TestDto GetTestItem(Test test)
{
return _mapper.Map<TestDto>(test);
}
// You may add additional implementation here.
}
使用示例TestMapper
作为
ITestMapper
注入。
ApiController
继承者。
// TestController.cs
[RoutePrefix("api/test")]
public class TestController : ApiController
{
private ITestMapper _testMapper;
public TestController(, ITestMapper testMapper)
{
_testMapper = testMapper;
}
[HttpGet]
[Route("GetTestItem/{id:int}")]
// GET api/<controller>/GetTestItem/5
public Prueba GetTestItem(int id)
{
var itemDb = _testRepository.GetTestItem(id); // it could be a service
var itemDto = _testMapper.GetTestItem(itemDb)
// Return the mapped object
return itemDto;
}
}
这里有一篇最近的文章,描述了如何使用 Autofac 设置自动映射器的注入。
祝你好运!