C# 自动映射初始化

C# 自动映射初始化,c#,automapper,C#,Automapper,我们有一个正在构建的应用程序,还有一个DataTranslationLayer,负责将数据库对象转换为视图模型对象 由于我们不将数据库对象传递给web项目,因此无法在global.asax中初始化。我们需要在DataTranslationLayer中初始化 问题是,当我们实例化该类时,它会进行另一次初始化,这导致了问题,因为AutoMapper被设计为只初始化一次 所以我的问题是,有人实施过类似的解决方案吗?你做了什么 是在应用程序启动时调用的DTL中创建静态类的解决方案,还是有更优雅的解决方案

我们有一个正在构建的应用程序,还有一个DataTranslationLayer,负责将数据库对象转换为视图模型对象

由于我们不将数据库对象传递给web项目,因此无法在global.asax中初始化。我们需要在DataTranslationLayer中初始化

问题是,当我们实例化该类时,它会进行另一次初始化,这导致了问题,因为AutoMapper被设计为只初始化一次

所以我的问题是,有人实施过类似的解决方案吗?你做了什么


是在应用程序启动时调用的DTL中创建静态类的解决方案,还是有更优雅的解决方案?

静态AutoMapper只是一个薄层。您可以轻松创建一个或多个具有不同配置的AutoMapper实例。
请参阅以了解如何执行此操作。

我不知道不将数据库对象传入web项目意味着什么,但可能您有一个复杂的分层体系结构。在这种情况下,一种方法是使用反射加载所有配置文件:

    var assembliesToScane = AppDomain.CurrentDomain.GetAssemblies();
    var allTypes = assembliesToScan.SelectMany(a => a.ExportedTypes).ToArray();

    var profiles =
        allTypes
            .Where(t => typeof(Profile).GetTypeInfo().IsAssignableFrom(t.GetTypeInfo()))
            .Where(t => !t.GetTypeInfo().IsAbstract);

    Mapper.Initialize(cfg =>
    {
        foreach (var profile in profiles)
        {
            cfg.AddProfile(profile);
        }
    });

您不直接引用任何一个配置文件,只需从当前AppDomain加载所有配置文件。

Hmmm,很有趣。谢谢