从(GAC)类库初始化Automapper

时间:2012-04-19 15:31:44

标签: c# dll configuration automapper gac

我目前正在尝试使用AutoMapper(最新的.NET 3.5版本)。 要使AutoMapper正常工作,您必须为其提供有关如何从一个对象映射到另一个对象的配置详细信息。

Mapper.CreateMap<ContactDTO, Contact>();
Mapper.CreateMap<Contact, ContactDTO>();

您应该在应用程序,服务,网站启动时执行此操作。 (使用global.asax等)

问题是,我在GAC的DLL中使用Automapper将LINQ2SQL对象映射到它们的BO对应物。 为了避免必须指定.CreateMap&lt;&gt;我想要地图2对象的详细信息,如果可能,我可以在哪里指定此配置一次

1 个答案:

答案 0 :(得分:0)

我相信解决方案是在AutoMapper本身。

使用AutoMapper配置文件并在启动时注册它们。

如果您的配置文件不需要任何依赖项,则示例bellow甚至不需要IOC容器。

/// <summary>
///     Helper class for scanning assemblies and automatically adding AutoMapper.Profile
///     implementations to the AutoMapper Configuration.
/// </summary>
public static class AutoProfiler
{
    public static void RegisterReferencedProfiles()
    {
        AppDomain.CurrentDomain
            .GetReferencedTypes()
            .Where(type => type != typeof(Profile) 
              && typeof(Profile).IsAssignableFrom(type) 
              && !type.IsAbstract)
            .ForEach(type => Mapper.Configuration.AddProfile(
              (Profile)Activator.CreateInstance(type)));
    }
}

他们就像这个例子一样实现Profiles:

public class ContactMappingProfile : Profile
{
    protected override void Configure()
    {
        this.CreateMap<Contact, ContactDTO>();
        this.CreateMap<ContactDTO, Contact>();
    }
}

但是如果你的Profiles有需要解决的依赖项,你可以为AutoMapper创建一个抽象,并在注册抽象之前注册所有的Profiles - IObjectMapper - 就像这样的单例:

public class AutoMapperModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        base.Load(builder);

        // register all profiles in container
        AppDomain.CurrentDomain
            .GetReferencedTypes()
            .Where(type => type != typeof(Profile)
              && typeof(Profile).IsAssignableFrom(type) 
              && !type.IsAbstract)
            .ForEach(type => builder
                .RegisterType(type)
                .As<Profile>()
                .PropertiesAutowired());

        // register mapper
        builder
            .Register(
                context =>
                {
                    // register all profiles in AutoMapper
                    context
                        .Resolve<IEnumerable<Profile>>()
                        .ForEach(Mapper.Configuration.AddProfile);
                    // register object mapper implementation
                    return new AutoMapperObjectMapper();
                })
            .As<IObjectMapper>()
            .SingleInstance()
            .AutoActivate();
    }
}

由于我在域中抽象出所有技术,这对我来说似乎是最好的方法。

现在去代码老兄,gooooo!

PS-代码可能正在使用一些助手和扩展,但核心的东西就在那里。