2017-12-14 9 views
-1
public static class PersonPropertyMapper 
{ 
    public static PeopleSearchBusinessLogic.DomainModels.Person ToDomainModel(this Entities.Person entity) 
    { 
     return new PeopleSearchBusinessLogic.DomainModels.Person() 
     { 
      Id = entity.Id, 
      Name = entity.Name, 
      Address = entity.Address, 
      Age = entity.Age, 
      Interests = entity.Interests, 
      Picture = entity.Picture 
     }; 
    } 
} 

ご覧のとおり、オブジェクトを前後に変換する拡張メソッドを持つクラスがあります。この場合、ToDomainModelメソッドはEntities.Personオブジェクトの拡張です。C#エクステンションメソッドのシグネチャが一致する方法

拡張メソッドを含むクラスは、他のクラスから派生したり、インターフェイスを実装したりすることはできません。しかし、 "PropertyMappers"をさらに追加すると、これらのクラスがすべて同じインターフェイスに従うようにして、メソッド名がアプリケーション全体で同じになるようにしたいと考えています。私はこれに簡単な解決策があるように感じるが、これは私がこの問題を遭遇した初めてのことではない。

例として、Carオブジェクトがあり、CarPropertyMapperを作成する必要があるとします。今、標準の "ToDomainModel"の代わりに "ToCarDomainModel()"という拡張メソッドの名前をつけるのを止めるものは何もありません。

私はこのジレンマを解決するための解決策が大好きです。あるいは、私がこれを間違った方法でやっている理由を少なくとも理解することができます。

また、私が見落としたオブジェクト(ドメインモデルやエンティティなど)をマッピングするための別のソリューションがありますか?

+1

これは拡張メソッドの対象ではありません。すべてのメソッドが同じ名前を持つようにするには、そのメソッドのインターフェイスを作成し、すべてのクラスを継承します。拡張メソッドは、基本クラスを変更できないが、メソッドを追加したいときに主に使用されます。 – Lauraducky

+0

@Lauraduckyああ、ありがとう!私はこれを行うためのより良い方法は、あなたが言ったように(ドメインモデルはエンティティについて知っているわけではないので)すべての変換メソッドシグネチャを持つEntities.Personクラス(IMapperと呼ばれる)用のインターフェイスを作成することですEntityクラスで変換の詳細を実装する必要があります。あるいは、以下に述べるようにAutoMapperを使うこともできます。私は解決策が私がそれを作るように複雑ではないと考えました。 –

答えて

1

拡張メソッドは静的クラスの静的メソッドですが、もちろんインターフェイスを実装したり、他のクラスを拡張することはできません。しかし、これは通常の使用ではありません。

これまでいくつかの解決策:

  • はAutoMapper
のようなマッピングライブラリを使用したものは、拡張メソッドを使用して静的クラス
  • 停止しているという事実を受け入れて、インターフェイス指向設計
  • に向けます
  • 関連する問題