C# 注射和/或模仿Automapper:为什么?

C# 注射和/或模仿Automapper:为什么?,c#,dependency-injection,automapper,C#,Dependency Injection,Automapper,我正在刷新关于Automapper API的知识 在探索IMapper界面时,我发现了几篇关于依赖注入和Automapper的帖子,例如and(它们是关于.NETCore的,但这在问题的上下文中并不重要) 假设像Automapper这样的映射器的典型用途是: public class Person { // person properties here } public class PersonDto { // person DTO properties here } pub

我正在刷新关于Automapper API的知识

在探索
IMapper
界面时,我发现了几篇关于依赖注入和Automapper的帖子,例如and(它们是关于.NETCore的,但这在问题的上下文中并不重要)

假设像Automapper这样的映射器的典型用途是:

public class Person
{
    // person properties here
}

public class PersonDto
{
    // person DTO properties here
}

public class SomeApi
{
    // other code here

    public PersonDto FindByName(string name)
    {
        var person = dbContext.People.FirstOrDefault(_ => _.Name == name);

        // mapper is IMapper
        return mapper.Map<PersonDto>(person);
    }
}
那么,我们在这里注射/嘲弄什么呢?赋值运算符?真的吗

它看起来像一个依赖注入一个依赖注入,没有任何好处

我错过什么了吗?
也许,有些情况下,注入/模拟Automapper真的很有用(我感兴趣的是在实践中发现的情况,而不是理论上的情况)?

出于同样的原因:进行纯单元测试。让我们以问题中的代码为例,对其进行修改,并添加一个简单的构造函数作为示例:

public class SomeApi
{
    private IMapper mapper;
    public SomeApi(IMapper mapper)
    {
        this.mapper = mapper;
    }
    // other code here

    public PersonDto FindByName(string name)
    {
        var person = dbContext.People.FirstOrDefault(_ => _.Name == name);

        // mapper is IMapper
        return mapper.Map<PersonDto>(person);
    }
}
公共类SomeApi
{
专用图像映射器;
公共SomeApi(IMapper映射器)
{
this.mapper=mapper;
}
//这里还有其他代码
public PersonDto FindByName(字符串名称)
{
var person=dbContext.People.FirstOrDefault(=>u.Name==Name);
//映射器是IMapper
返回mapper.Map(人);
}
}
如果我想为
FindByName
编写一个单元测试,并且我想模拟
IMapper
,因为我希望测试完全基于我的模拟而不是自动映射,该怎么办。或者,如果我没有决定使用AutoMapper,而是使用实现
IMapper
的任何类型,该怎么办。或者,我不希望我的
SomeApi
类与AutoMapper耦合,也不希望对AutoMapper有任何依赖

如果
SomeApi
类位于程序集中,则它不需要了解AutoMapper,它只需要了解
IMapper
。什么样的
IMapper
实现可以在会议上决定。这样,如果使用您的API的人不喜欢AutoMapper,无论出于何种原因,都可以使用他们想要的任何映射器

在对本答复的评论中,您指出:

1) 当你扔掉方法中最大的部分时,你在测试什么

我正在测试数据库中查找姓名的人的代码是否正常工作

2) 注入IMapper,您将从Automapper带来依赖性

不,我不是。如果您的SomeApi类没有耦合到AutoMapper的
IMapper
,而只是另一个名为
IMapper
的接口,但具有更少或更多的方法或相同的方法,那么这就是您要耦合到的接口

3) 你有没有见过定制的IMapper实现(我是说,在实践中)

没有。我也没有看到编译器,但它们确实存在。我刚才看到有人写了一篇关于AutoMapper(和其他mapper)的性能与手动映射的文章,我明白为什么有些人可能想使用自己的mapper。请看


你的问题是为什么要这样做,这就是我能想到的原因。我是说你应该这么做吗?绝对不是

出于同样的原因:进行纯单元测试。让我们以问题中的代码为例,对其进行修改,并添加一个简单的构造函数作为示例:

public class SomeApi
{
    private IMapper mapper;
    public SomeApi(IMapper mapper)
    {
        this.mapper = mapper;
    }
    // other code here

    public PersonDto FindByName(string name)
    {
        var person = dbContext.People.FirstOrDefault(_ => _.Name == name);

        // mapper is IMapper
        return mapper.Map<PersonDto>(person);
    }
}
公共类SomeApi
{
专用图像映射器;
公共SomeApi(IMapper映射器)
{
this.mapper=mapper;
}
//这里还有其他代码
public PersonDto FindByName(字符串名称)
{
var person=dbContext.People.FirstOrDefault(=>u.Name==Name);
//映射器是IMapper
返回mapper.Map(人);
}
}
如果我想为
FindByName
编写一个单元测试,并且我想模拟
IMapper
,因为我希望测试完全基于我的模拟而不是自动映射,该怎么办。或者,如果我没有决定使用AutoMapper,而是使用实现
IMapper
的任何类型,该怎么办。或者,我不希望我的
SomeApi
类与AutoMapper耦合,也不希望对AutoMapper有任何依赖

如果
SomeApi
类位于程序集中,则它不需要了解AutoMapper,它只需要了解
IMapper
。什么样的
IMapper
实现可以在会议上决定。这样,如果使用您的API的人不喜欢AutoMapper,无论出于何种原因,都可以使用他们想要的任何映射器

在对本答复的评论中,您指出:

1) 当你扔掉方法中最大的部分时,你在测试什么

我正在测试数据库中查找姓名的人的代码是否正常工作

2) 注入IMapper,您将从Automapper带来依赖性

不,我不是。如果您的SomeApi类没有耦合到AutoMapper的
IMapper
,而只是另一个名为
IMapper
的接口,但具有更少或更多的方法或相同的方法,那么这就是您要耦合到的接口

3) 你有没有见过定制的IMapper实现(我是说,在实践中)

没有。我也没有看到编译器,但它们确实存在。我刚才看到有人写了一篇关于AutoMapper(和其他mapper)的性能与手动映射的文章,我明白为什么有些人可能想使用自己的mapper。请看


你的问题是为什么要这样做,这就是我能想到的原因。我是说你应该这么做吗?绝对不是

将其分解为两个问题:

  • 你为什么要注射IMapper
  • 你为什么要嘲笑伊玛珀
对于第一个问题,我将注入IMapper,以防其中一个映射扩展需要依赖项。例如,如果您正在使用使用
DbContext
的自定义
IValueResolver
ITypeConverter
,则需要确保提供了正确的
DbContext
。如果将容器设置为使用factory方法创建映射器实例,则扩展