.NET Core 中依赖注入 AutoMapper 小记

最近在 review 代码时发现同事没有像其他项目那样使用 AutoMapper.Mapper.Initialize() 静态方法配置映射,而是使用了依赖注入 IMapper 接口的方式

services.AddSingleton<IMapper>(new Mapper(new MapperConfiguration(cfg =>
{
    cfg.CreateMap<User, MentionUserDto>();
})));

于是趁机学习了解一下,在 github 上发现了 AutoMapper.Extensions.Microsoft.DependencyInjection ,使用它只需通过 AutoMapper.Profile 配置映射

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<User, MentionUserDto>();
    }
}

然后通过 AddAutoMapper() 进行依赖注入,它会在当前程序集自动找出所有继承自 Profile 的子类添加到配置中

services.AddAutoMapper();

后来发现在使用 ProjectTo 时

.Take(10)
.ProjectTo<MentionUserDto>()
.ToListAsync(); 

发现如果自己使用 AddSingleton<IMapper>() ,会出现下面的错误(详见博问):

Mapper not initialized. Call Initialize with appropriate configuration.

使用 AddAutoMapper() 并且将 UseStaticRegistration 为 false 时也会出现同样的问题。

解决方法是给 ProjectTo 传参 _mapper.ConfigurationProvider (注:传 _mapper 不行)

.ProjectTo<MentionUserDto>(_mapper.ConfigurationProvider)

对于自己依赖注入的操作方式,后来参考  AutoMapper.Extensions.Microsoft.DependencyInjection 的实现

services.AddSingleton(config);
return services.AddScoped<IMapper>(sp => new Mapper(sp.GetRequiredService<IConfigurationProvider>(), sp.GetService));

采用了下面的方式,如果不想使用 AddAutoMapper()  通过反射自动找出 Profile ,建议使用这种方式

AutoMapper.IConfigurationProvider config = new MapperConfiguration(cfg =>
{
    cfg.AddProfile<MappingProfile>();
});
services.AddSingleton(config);
services.AddScoped<IMapper, Mapper>();

原文地址:https://www.cnblogs.com/dudu/p/8279114.html

时间: 2024-11-11 04:18:04

.NET Core 中依赖注入 AutoMapper 小记的相关文章

用工厂模式解决ASP.NET Core中依赖注入的一个烦恼

这是最近在实际开发中遇到的一个问题,用 asp.net core 开发一个后端 web api ,根据指定的 key 清除 2 台 memcached 服务器上的缓存.背景是我们在进行 .net core 迁移工作,asp.net 项目与 asp.net core 项目并存,为了避免两种类型项目的缓存冲突,我们分别用了 2 台不同的 memcached 服务器. 之前使用 1 台 memcached 服务器时,只需要一个客户端,所以只需创建一个 MemcachedClient 单例并注入到 IM

spring中依赖注入方式总结

Spring中依赖注入的四种方式 在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的setter方法注入 首先要配置被注入的bean,在该bean对应的类中,应该有要注入的对象属性或者基本数据类型的属性.例如:为UserBiz类注入UserDAO,同时为UserBiz注入基本数据类型String,那么这时,就要为UserDAO对象和String类型设置se

.Net Core 使用依赖注入

ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection 在asp .net中使用依赖注入很简单,只需要在Startup类的ConfigureServices(IServiceCollection services)方法中,通过IServiceCollection接口注入就行. 通过接口的Add*方法进行注册,代码如下: ASP.NET Core runtime帮忙注册如下方法 // This method gets c

【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类

依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依赖注入后,你的编程思维就得变一变了.在过去,许多功能性的类型(比如一个加密解密的类),我们都喜欢将其定义为静态(static),而有了依赖注入,你就要避免使用静态类型,应该交由服务容器帮你管理,只要你用好了,你会发现依赖注入是很方便的. 依赖注入的初级玩法,也是比较标准的玩法,此种玩法有两种模式:

net core WebApi——依赖注入Autofac

目录 前言 Autofac 添加一个Util来随时调用 小结 代码地址 预告 前言 周末加班,下午犯困,整理下之前鼓捣过的东西,看过我之前的webapi系列的读者知道,我之前试过Aspect,但是升级到3.0之后没往下去试了,当时还留了个坑,这不,现在果断移除了换成这个了. Autofac 这个第三方类库呢,是Ioc的容器,可以简化我们很大的工作量,比如说在之前我们需要写个类去声明接口与实现,而用了这个容器呢,就不需要了,当然还是需要些配置的. 首先,引入第三方类库,不多说. 然后开始配置吧,首

Catel帮助手册-Catel.Core:(5)依赖注入(ServiceLocator and TypeFactory)

1,简介 在Catel2.0之前,IOC容器内部使用的是Unity,然而,这就强制所有的用户在他的应用程序中使用Unity作为IOC容器,也需要这样划分库,从2.0以后,一个不同的技术被使用了,这个允许开发者可以使用他们自己悬着的IOC容器技术. 1.1在Ioc中不同的组件 在Catel中有许多不同的组件他们对于Ioc是非常重要的. ServiceLocator 该组件用于注册所有的类型,这个事真正的Ioc容器 TypeFactory 用于创建类型的组件,使用IServiceLocator来获取

Spring点滴七:Spring中依赖注入(Dependency Injection:DI)

Spring机制中主要有两种依赖注入:Constructor-based Dependency Injection(基于构造方法依赖注入) 和 Setter-based Dependency Injection(基于Setter方法依赖注入) 一.Contructor-based Dependency Injection(基于构造方法注入) 在bean标签中通过使用<constructor-arg />标签来实现 spring.xml <?xml version="1.0&qu

Android开发中依赖注入的应用

什么是依赖注入? 依赖是指一个对象持有其他对象的引用.依赖注入则是将这些依赖对象传递给被依赖对象,而不是被依赖对象自己创建这些对象. public class MyClass{ private AnotherClass mAnotherObject; public MyClass(){ mAnotherObject = new AnotherClass(); } } 通过传递对象的方式,所传递对象的更改不会影响代码. public class MyClass{ private MyInterfa

spring中依赖注入

<!--spring中的依赖注入 依赖注入: Dependency Injection IOC的作用: 降低程序间的耦合(依赖关系) 依赖关系的管理: 以后都交给spring来维护 在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明 依赖关系的维护: 就称之为依赖注入 依赖注入: 能注入的数据:有三种 基本类型和String 其他bean类型(在配置文件中或者注解配置过的bean) 复杂类型/集合类型 注入的方式:有三种 第一种:使用构造函数提供 第二种:使用se