如何将 Automapper 与 Autofac 一起使用

问题描述 投票:0回答:4

我已升级到最新版本的 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)”需要对象引用

c# asp.net-web-api asp.net-web-api2 automapper autofac
4个回答
15
投票

这是我之前做的:

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


8
投票

还有一个 nuget-package 可以为您完成所有这些工作。

您需要做的就是在

ContainerBuilder
上调用扩展方法并传入程序集,应该扫描 AutoMapper 类型。

var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterAutoMapper(typeof(MvcApplication).Assembly);
// more registrations here

您可以在这里找到它。您也可以在 AutoMapper docs 中找到官方示例。

编辑: 这里有 ASP.NET Core 和控制台应用程序的示例


1
投票
这是我在 NET Framework 4.7.2 中应用于 Web API 2 项目的实现,但不管它看起来有多旧,您也可以使用它。

  • 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
初始化

注意第二行。这就是您将初始化 Autofact 静态类的地方。

// 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 配置

    这是 Autofac 的整个配置文件。这是一个静态类。
  • 注意
  • #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; } }
    

0
投票
虽然我自己对 Autofac 并不熟悉,但

这里有一篇最近的文章,描述了如何使用 Autofac 设置自动映射器的注入。

祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.