从 (GAC) 类库初始化自动映射器

本文关键字:映射 初始化 类库 GAC | 更新日期: 2023-09-27 18:31:44

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

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

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

问题是,我在 GAC d DLL 中使用自动映射器将LINQ2SQL对象映射到它们的 BO 对应项。为了避免必须指定 .CreateMap<> 详细信息我一直想要映射 2 对象,如果可能的话,我可以在哪里指定此配置一次

从 (GAC) 类库初始化自动映射器

我相信

解决方案就在自动映射器本身。

使用自动映射器配置文件并在启动时注册它们。

如果您的配置文件不需要任何依赖项,则以下示例甚至不需要 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)));
    }
}

他们只是实现配置文件,就像这个例子一样:

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

但是,如果您的配置文件具有需要解析的依赖项,则可以为 AutoMapper 创建一个抽象,并在将抽象 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();
    }
}

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

现在去编码,伙计,噗!

PS-代码可能使用一些帮助程序和扩展,但它的核心内容就在那里。