我有一個AutoMapper
輪廓目前取決於UrlHelper
以下映射:消除對UrlHelper的依賴?
CreateMap<Post, OpenGraphModel>().ForMember(
m => m.Title,
x => x.MapFrom(p => p.Link.Title)
).ForMember(
m => m.Description,
x => x.MapFrom(p => p.Link.Description)
).ForMember(
m => m.Image,
x => x.MapFrom(p => p.Link.Picture)
).ForMember(
m => m.Url,
x => x.MapFrom(p => urlHelper.RouteUrl("PostShortcut", new { id = p.Id }, "http"))
);
這是罰款,直到當我想重用我AutoMapper
的個人資料背景下,這是一個Web請求之外。
我能想到的這三種解決方案,其中沒有一個真正說服我(排名不分先後):
從映射輪廓完全消除
UrlHelper
依賴。
這意味着我現在必須手動映射OpenGraphModel
的屬性,在我看來,這種方式擊敗了使用AutoMapper
的目的。我喜歡我的映射器能夠在目標對象中設置我需要的所有屬性。從非web上下文中刪除此映射配置文件,因爲非web請求上下文不應直接映射到直接查看模型。
爲了做到這一點,我將不得不使我的IMapper
實例或者是每個web請求(或線程)的瞬態,而不是單例,這引入了我不想引入的額外開銷。第三種選擇是在非web請求上下文(即作業)上不使用
IMapper
實現,但這看起來幾乎沒有問題,因爲我重複使用最終要求我使用映射器。
我猜有2單映射器將是一個讓最有意義(其中選擇基於上下文的配置文件),但我不知道我應該怎麼做,這是我的AutoMapper安裝在它的當前形式:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using AutoMapper;
using AutoMapper.Mappers;
using Castle.MicroKernel;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor;
namespace Common
{
internal sealed class AutoMapperInstaller : IWindsorInstaller
{
private readonly Type[] profileTypes;
public AutoMapperInstaller(params Type[] profileTypes)
{
if (profileTypes == null)
{
throw new ArgumentNullException("profileTypes");
}
this.profileTypes = profileTypes;
}
public void Install(IWindsorContainer container, IConfigurationStore store)
{
IEnumerable<Assembly> assemblies = profileTypes.Select(t => t.Assembly).ToList();
foreach (Assembly assembly in assemblies)
{
container.Register(
AllTypes
.FromAssembly(assembly)
.BasedOn(typeof (ITypeConverter<,>))
.WithServiceSelf()
);
}
foreach (Assembly assembly in assemblies)
{
container.Register(
Classes
.FromAssembly(assembly)
.BasedOn<Profile>()
.LifestyleTransient()
);
}
container.Register(
Component
.For<ITypeMapFactory>()
.ImplementedBy<TypeMapFactory>()
.LifestyleTransient()
);
container.Register(
Component
.For<IConfiguration, IConfigurationProvider>()
.UsingFactoryMethod(InstanceConfigurationStore)
.LifestyleTransient()
);
container.Register(
Component
.For<IMappingEngine>()
.ImplementedBy<MappingEngine>()
.LifestyleTransient()
);
container.Register(
Component
.For<IMapper>()
.ImplementedBy<Mapper>()
.DynamicParameters(
(k, parameters) => parameters["profileTypes"] = profileTypes
)
.LifestyleSingleton()
);
}
private ConfigurationStore InstanceConfigurationStore(IKernel kernel)
{
ITypeMapFactory typeMapFactory = kernel.Resolve<ITypeMapFactory>();
IEnumerable<IObjectMapper> mappers = MapperRegistry.AllMappers();
return new ConfigurationStore(typeMapFactory, mappers);
}
}
}
你的'urlHelper'在Web請求中是如何傳遞給AutoMapper的? –