1

2 か月前に、この問題について質問しました。問題はまだ存在します。

エラーは特定の Entity-DTO マッピングではなく、コントローラーの最初の Entity-DTO で発生することがわかったため、ここで同じ問題をコピー/貼り付けするつもりはありません。

つまり、プログラム フローが Country-CountryDto にヒットした場合、エラーは次のように表示されます。

Missing type map configuration or unsupported mapping.

Mapping types: 
Country -> CountryDTO 
MyApp.Domain.BoundedContext.Country -> MyApp.Application.BoundedContext.CountryDTO

Destination path: 
List`1[0]

Source value: 
MyApp.Domain.BoundedContext.Country

または、最初の手でアカウントのチェックがある場合、エラーは次のように表示されます。

Missing type map configuration or unsupported mapping.

Mapping types:
Account -> AccountDTO
MyApp.Domain.BoundedContext.Account -> MyApp.Application.BoundedContext.AccountDTO

Destination path:
AccountDTO

Source value:
MyApp.Domain.BoundedContext.Account

また、N レイヤー ソリューションのプレゼンテーション レイヤー (この場合は MVC 3 プロジェクト) を再構築するたびにエラーが発生しないこともわかりました。そして、ランダムな時間に、それは再び起こります。

この問題が開発環境でのみ発生した場合は大したことではありませんが、公開後も問題が発生していたため、非常に困っています。

Google、Stackoverflow、Automapper Forums/Groups を検索しましたが、成功しませんでした。

Mapper.AssertConfigurationIsValid() を使用してマッピングもテストしましたが、すべて問題ありませんでした。

私のプロジェクトは、Automapper 2.2 と Unity IoC を使用した MVC 3 プロジェクトです。

繰り返しになりますが、アイデア、アドバイス、または解決策をいただければ幸いです。

編集: OK、今、私は手がかりを持っています..私は、すべてのマッピングが行われる ManagementProfile というプロファイルを持っています。には、AutomapperTypeAdapterFactory()次のようなコードがあります。

public AutomapperTypeAdapterFactory()
    {
        //Scan all assemblies to find an Auto Mapper Profile
        var profiles = AppDomain.CurrentDomain.GetAssemblies()
                                .SelectMany(a => a.GetTypes())
                                .Where(t => t.BaseType == typeof(Profile));

        Mapper.Initialize(cfg =>
        {
            foreach (var item in profiles)
            {
                if (item.FullName != "AutoMapper.SelfProfiler`2")
                    cfg.AddProfile(Activator.CreateInstance(item) as Profile);
            }
        });
    }

通常、profiles変数は ManagementProfile を保持していることわかりましたが、情報を取得できず"Enumeration yielded no results"、この質問に記載されている例外が発生する場合があります。

さらに調査すると、すべてが正常な場合AppDomain.CurrentDomain.GetAssemblies()は 85 個のアセンブリが読み込まれ、一方、例外が発生した場合は 41 個のアセンブリのみが読み込まれ、欠落しているアセンブリの 1 つが DTO マッピングを保持するものであることが明らかになりました。

4

3 に答える 3

2

わかりました、私はついにそれを理解しました。:

AppDomain.CurrentDomain.GetAssemblies()

コードの一部がマッピング アセンブリを取得しないことがあるため、欠落している間にエラーが発生します。アプリにすべてのアセンブリを強制的に検索させることでこのコードを置き換えると、私の問題は解決しました。

返信ありがとうございます。

編集: Andrew Brownがソリューションのコードについて尋ねたところ、ソース コードのスニペットが含まれていないことに気付きました。AssemblyLocator は次のとおりです。

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Compilation;

public static class AssemblyLocator
{
    private static readonly ReadOnlyCollection<Assembly> AllAssemblies;
    private static readonly ReadOnlyCollection<Assembly> BinAssemblies;

    static AssemblyLocator()
    {
        AllAssemblies = new ReadOnlyCollection<Assembly>(
            BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList());

        IList<Assembly> binAssemblies = new List<Assembly>();

        string binFolder = HttpRuntime.AppDomainAppPath + "bin\\";
        IList<string> dllFiles = Directory.GetFiles(binFolder, "*.dll",
            SearchOption.TopDirectoryOnly).ToList();

        foreach (string dllFile in dllFiles)
        {
            AssemblyName assemblyName = AssemblyName.GetAssemblyName(dllFile);

            Assembly locatedAssembly = AllAssemblies.FirstOrDefault(a =>
                AssemblyName.ReferenceMatchesDefinition(
                    a.GetName(), assemblyName));

            if (locatedAssembly != null)
            {
                binAssemblies.Add(locatedAssembly);
            }
        }

        BinAssemblies = new ReadOnlyCollection<Assembly>(binAssemblies);
    }

    public static ReadOnlyCollection<Assembly> GetAssemblies()
    {
        return AllAssemblies;
    }

    public static ReadOnlyCollection<Assembly> GetBinFolderAssemblies()
    {
        return BinAssemblies;
    }
}

したがって、AppDomain.CurrentDomain.GetAssemblies() を使用する代わりに、次のような提供されたヘルパー クラスの GetAssemblies() メソッドを呼び出しています。

//Scan all assemblies to find an Auto Mapper Profile
//var profiles = AppDomain.CurrentDomain.GetAssemblies()
//                        .SelectMany(a => a.GetTypes())
//                        .Where(t => t.BaseType == typeof(Profile));
var profiles = AssemblyLocator.GetAssemblies().
                               SelectMany(a => a.GetTypes()).
                               Where(t => t.BaseType == typeof(Profile));
于 2013-05-27T11:42:20.420 に答える
1

最近、同様の問題がありました。AutoMapper.Initialize同じ AppDomain で実行されているコードで複数の呼び出しがあったことが判明しました (これは WCF サービスでした)。呼び出しは異なるマッピングを登録します。

AutoMapper.Initialize以前に登録されたマッピングをクリアするため、複数のスレッドが同時に実行されていると、構成が競合してエラーがスローされ、単体テストと統合テストでは完全に正常に機能していました。

AutoMapper.Initializeしたがって、 (and )への呼び出しのコード ベースをスキャンし、呼び出しがAutoMapper.Reset1 つだけであることを確認します。複数のステップで AutoMapper を構成する必要がある場合はAutoMapper.Configure、後続のステップで使用します。

詳細はこちら

于 2013-04-30T15:58:32.373 に答える
0

私にとって、このエラーはCreateMap<>()電話をかけた場所に関係していました。DTOの静的初期化子に入れました。CreateMap<>()呼び出しをあまりかわいくない場所に移動すると、すべて正常に機能しました。

于 2015-03-05T16:42:18.080 に答える