Automapper能在控制台应用程序中使用吗?

15

是否可以在控制台应用程序中使用automapper

它的入门页面建议从应用程序启动时调用启动类,但是没有关于添加和从Main()调用类的更多详细信息。

我该如何在简单的控制台应用程序中使用它?

3个回答

13
你可以在控制台启动中初始化Automapper,没有任何限制;Application_start是.net/iis中Web程序的启动位置,即仅调用一次的代码。您必须在Web项目启动时调用的任何配置都放在此方法中。
编辑评论:如果您不想即时创建映射,而是想要一个初始化所有映射的地方,请创建名为InitializeAutomapper的函数,并在其中进行Mapper.Configure调用。然后在Main()方法中调用该函数。有很多处理配置的方式,但这是处理它的简单方式。
代码示例:
class Program
    {
        static void Main(string[] args)
        {
            // the app is starting here
            InitializeAutomapper();
            // we're configured, let's go!
            DoStuff();
        }

        static void InitializeAutomapper()
        {
            AutoMapper.Mapper.CreateMap<TypeA, TypeB>();
            AutoMapper.Mapper.CreateMap<TypeC, TypeD>();
            AutoMapper.Mapper.CreateMap<TypeE, TypeF>();
        }
    }

我不确定你觉得答案的哪一部分令人困惑。Application_Start与控制台应用程序中的Main方法或多或少是可比较的。如果您的所有方法都是静态的,您可以在那里初始化它,或者如果您计划使用实例方法,则可以在应用程序的构造函数中进行初始化。 - Roman
1
尽管我已经引用了AutoMapper.dll,但在我的CreateMap和Map调用处仍出现“AutoMapper does not exist in the current context”错误。如果该映射是所有初始化所需的内容,则我将调查为什么该引用无效。 - StuperUser
@StuperUser:尝试发布初始化代码;我发布的代码有效(前提是有TypeA到TypeF和DoStuff方法)。 - samy
@samy,这个问题还是类似的错误,引用有点小问题。它在解决方案资源管理器中的“引用”目录下,但即使重新启动/重新添加项目后,AutoMapper命名空间仍然会从对象浏览器中消失。 - StuperUser
1
@samy,似乎AutoMapper也需要System.Web。 - StuperUser
1
@R0MANARMY 混淆的原因在于问题中没有包含任何其他需要配置的细节,由于我的映射是即时完成的,所以我不需要配置任何内容。我的问题是由于对 System.Web 的明显依赖引起的,通过添加引用来解决这个问题。 - StuperUser

12

我知道这是一个老问题,但如果你看到了这个,我想添加一些更新:Automaper不再允许静态初始化。

你可以在这里查看更多

接下来,我提供了一个控制台应用程序如何使用它的完整示例。希望这对未来的某个人有所帮助。

class Program
{
    static void Main(string[] args)
    {
        var config = new MapperConfiguration(cfg => {
            cfg.CreateMap<MyClass, MyClassDTO>();
        });
        IMapper mapper = config.CreateMapper();

        var myClass = new MyClass(){
            Id = 10,
            Name = "Test"
        };
        var dst = mapper.Map<MyClass, MyClassDTO>(myClass);

        Console.WriteLine(dst.Id);
    }
}

class MyClass
{
    public int Id {get;set;}
    public string Name {get;set;}
}

public class MyClassDTO
{
    public int Id {get;set;}
    public string Name {get;set;}
}

不要忘记包含 using AutoMapper;


0

是的,但它似乎依赖于System.Web,也必须包含在其中。

(有关更多详细信息,请参见神秘消失的引用


这真的很奇怪,因为System.Web位于GAC中并且由...找到,所以您不应该遇到这些问题,无论如何,好发现 :) 为了记录,我使用NuGet快速测试了我发布的解决方案,但是我在控制台项目中找不到对System.Web的硬引用。 - samy
2
@samy:这可能与这个有关。虽然没有直接依赖关系,但是有一个间接依赖关系。 - Roman
@StuperUser 你使用的是客户端框架吗?如果是,R0MANARMY可能已经通过他的链接找到了原因。 - samy
@samy @R0MANARMY 这是一个新的示例控制台项目中默认的内容,添加 System.Web 后它将更新项目的目标框架为 .NET Framework 4。@R0MANARMY 破解了它。 - StuperUser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接