21

以下のようなコードがあります。基本的には、Web サービスからデータを取得し、それをクライアント側のオブジェクトに変換することを表します。

void Main()
{
    Mapper.CreateMap<SomethingFromWebService, Something>();    
    Mapper.CreateMap<HasSomethingFromWebService, HasSomething>(); 
    // Service side
    var hasSomethingFromWeb = new HasSomethingFromWebService();
    hasSomethingFromWeb.Something = new SomethingFromWebService
            { Name = "Whilly B. Goode" };
    // Client Side                
    HasSomething hasSomething=Mapper.Map<HasSomething>(hasSomethingFromWeb);  
}    
// Client side objects
public interface ISomething
{
    string Name {get; set;}
}    
public class Something : ISomething
{
    public string Name {get; set;}
}    
public class HasSomething
{
    public ISomething Something {get; set;}
}    
// Server side objects
public class SomethingFromWebService
{
    public string Name {get; set;}
}    
public class HasSomethingFromWebService
{
    public SomethingFromWebService Something {get; set;}
}

私が抱えている問題は、クラス (この場合は HasSomething.ISomething) でインターフェイスを使用したいということですが、AutoMapper を具象型にマップする必要があります。(具象型にマップしないと、AutoMapper がプロキシを作成します。これにより、アプリで他の問題が発生します。)

上記のコードでは、次のエラーが表示されます。

タイプ マップ構成が欠落しているか、サポートされていないマッピングです。

マッピング タイプ: SomethingFromWebService -> ISomething
UserQuery+SomethingFromWebService -> UserQuery+ISomething

私の質問は、どうすれば具象型にマップし、クラスでインターフェイスを引き続き使用できるかということです。

注:このマッピングを追加しようとしました:

Mapper.CreateMap<SomethingFromWebService, ISomething>();

しかし、返されたオブジェクトはタイプSomethingではなく、ISomething をテンプレートとして使用して生成されたプロキシを返します。

4

1 に答える 1

39

だから私はうまくいくと思われる何かを考え出した。

これら 2 つのマッピングを追加すると、次のようになります。

Mapper.CreateMap<SomethingFromWebService, Something>();
Mapper.CreateMap<SomethingFromWebService, ISomething>().As<Something>(); 

それは私が望むように動作します。

「As」メソッドに関するドキュメントを見つけることができませんでした (グーグルで検索してみてください! :) が、マッピングのリダイレクトのようです。

例: このマッピング ( ) の場合、それを にISomething解決します。AsSomething

于 2012-10-25T19:36:02.677 に答える