AutoMapper,远离过时的静态 API
AutoMapper, moving away from the Obsolete Static API
我正在使用现有的解决方案。该解决方案使用 Windsor IoC。我有一个 AutomapperMappings.cs
class 看起来像这样:
public class AutoMapperMappings
{
public static void Configure()
{
AutoMapper.Mapper.Configuration
.CreateMap<LatestUpdateModel, LatestUpdate>();
AutoMapper.Mapper.Configuration
.CreateMap<LatestUpdate, LatestUpdateModel>();
AutoMapper.Mapper.Configuration
.CreateMap<DownloadLinkModel, DownloadLink>();
AutoMapper.Mapper.Configuration
.CreateMap<DownloadLink, DownloadLinkModel>();
AutoMapper.Mapper.Configuration
.CreateMap<NavigationElementModel, NavigationElement>();
AutoMapper.Mapper.Configuration
.CreateMap<NavigationElement, NavigationElementModel>();
AutoMapper.Mapper.Configuration
.CreateMap<Promobox, PromoboxModel>();
AutoMapper.Mapper.Configuration
.CreateMap<PromoboxModel, Promobox>();
}
}
在我的 Global.asax
中,我有以下内容:
protected void Application_Start(object sender, EventArgs e)
{
IoCContainer();
ConfigureAutoMapperMappings();
}
protected virtual void ConfigureAutoMapperMappings()
{
AutoMapperMappings.Configure();
}
以上是警告我应该远离静态API。所以我四处搜索并做了一些阅读,建议我将 AutomapperMappings.cs
更改为:
public class AutoMapperMappings
{
public static void Configure()
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<LatestUpdateModel, LatestUpdate>();
cfg.CreateMap<LatestUpdate, LatestUpdateModel>();
cfg.CreateMap<DownloadLinkModel, DownloadLink>();
cfg.CreateMap<DownloadLink, DownloadLinkModel>();
cfg.CreateMap<NavigationElementModel, NavigationElement>();
cfg.CreateMap<NavigationElement, NavigationElementModel>();
cfg.CreateMap<Promobox, PromoboxModel>();
cfg.CreateMap<PromoboxModel, Promobox>();
});
}
}
一切都很好,但是变量 var config
实际上并没有在任何地方使用,所以我确定我需要做更多的事情,但我不知道我需要改变什么
我会在这里查看 Jimmy Bogards(Automapper 创建者)post:
https://lostechies.com/jimmybogard/2016/01/21/removing-the-static-api-from-automapper/
IMapper mapper = config.CreateMapper();
配置可用于 return IMappper 接口,可以更轻松地用于测试目的、创建新映射等。
有教程"Migrating from static API"。
您需要创建 mapper
对象并将其注册到 IoC 容器:
public class AutoMapperMappings
{
public static void Configure(IWindsorContainer container)
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<LatestUpdateModel, LatestUpdate>();
...
});
var mapper = config.CreateMapper();
// register your mapper here.
container.Register(Component.For<IMapper>().Instance(mapper));
}
}
现在您可以将映射器注入需要映射实体的 类:
public class ExampleClass
{
private readonly IMapper _mapper;
public ExampleClass(IMapper mapper)
{
_mapper = mapper;
}
public void DoWork()
{
var model = new LatestUpdateModel();
...
var update = mapper.Map<LatestUpdateModel, LatestUpdate>(model);
}
}
此迁移将通过为 IMapper
接口创建模拟对象来帮助您使代码更易于测试。
我正在使用现有的解决方案。该解决方案使用 Windsor IoC。我有一个 AutomapperMappings.cs
class 看起来像这样:
public class AutoMapperMappings
{
public static void Configure()
{
AutoMapper.Mapper.Configuration
.CreateMap<LatestUpdateModel, LatestUpdate>();
AutoMapper.Mapper.Configuration
.CreateMap<LatestUpdate, LatestUpdateModel>();
AutoMapper.Mapper.Configuration
.CreateMap<DownloadLinkModel, DownloadLink>();
AutoMapper.Mapper.Configuration
.CreateMap<DownloadLink, DownloadLinkModel>();
AutoMapper.Mapper.Configuration
.CreateMap<NavigationElementModel, NavigationElement>();
AutoMapper.Mapper.Configuration
.CreateMap<NavigationElement, NavigationElementModel>();
AutoMapper.Mapper.Configuration
.CreateMap<Promobox, PromoboxModel>();
AutoMapper.Mapper.Configuration
.CreateMap<PromoboxModel, Promobox>();
}
}
在我的 Global.asax
中,我有以下内容:
protected void Application_Start(object sender, EventArgs e)
{
IoCContainer();
ConfigureAutoMapperMappings();
}
protected virtual void ConfigureAutoMapperMappings()
{
AutoMapperMappings.Configure();
}
以上是警告我应该远离静态API。所以我四处搜索并做了一些阅读,建议我将 AutomapperMappings.cs
更改为:
public class AutoMapperMappings
{
public static void Configure()
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<LatestUpdateModel, LatestUpdate>();
cfg.CreateMap<LatestUpdate, LatestUpdateModel>();
cfg.CreateMap<DownloadLinkModel, DownloadLink>();
cfg.CreateMap<DownloadLink, DownloadLinkModel>();
cfg.CreateMap<NavigationElementModel, NavigationElement>();
cfg.CreateMap<NavigationElement, NavigationElementModel>();
cfg.CreateMap<Promobox, PromoboxModel>();
cfg.CreateMap<PromoboxModel, Promobox>();
});
}
}
一切都很好,但是变量 var config
实际上并没有在任何地方使用,所以我确定我需要做更多的事情,但我不知道我需要改变什么
我会在这里查看 Jimmy Bogards(Automapper 创建者)post:
https://lostechies.com/jimmybogard/2016/01/21/removing-the-static-api-from-automapper/
IMapper mapper = config.CreateMapper();
配置可用于 return IMappper 接口,可以更轻松地用于测试目的、创建新映射等。
有教程"Migrating from static API"。
您需要创建 mapper
对象并将其注册到 IoC 容器:
public class AutoMapperMappings
{
public static void Configure(IWindsorContainer container)
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<LatestUpdateModel, LatestUpdate>();
...
});
var mapper = config.CreateMapper();
// register your mapper here.
container.Register(Component.For<IMapper>().Instance(mapper));
}
}
现在您可以将映射器注入需要映射实体的 类:
public class ExampleClass
{
private readonly IMapper _mapper;
public ExampleClass(IMapper mapper)
{
_mapper = mapper;
}
public void DoWork()
{
var model = new LatestUpdateModel();
...
var update = mapper.Map<LatestUpdateModel, LatestUpdate>(model);
}
}
此迁移将通过为 IMapper
接口创建模拟对象来帮助您使代码更易于测试。