1

Emit Mapperを使用してUserクラスをUserModelクラスにマップする方法は?

    public class User
    {
        public Guid Id { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public IList<Role> Roles { get; set; }

        public Company Company { get; set; }        
    }

    public class UserModel
    {
        public Guid Id { get; set; }

        public Guid CompanyId { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }      

        public IList<RoleModel> Roles { get; set; }
}

いくつかの問題があります:

  • Company オブジェクトの代わりに CompanyId を持つように、オブジェクトをフラット化する必要があります。
  • Company オブジェクトにはプロパティ Id があり、UserModel には会社 ID に対応する CompanyId がありますが、プロパティ名が一致しません。
  • にマップList<Role>する必要がありますList<RoleModel>
4

2 に答える 2

1

フラット化されたモデルを取得するには、この例を確認できます。しかし、デフォルトでは、サブクラスのプロパティ名をターゲットのプレフィックスとして持つという規則があるようです。

ソース

public class SourceObject
{
public SourceSubObject SomeClass { get; set; }
}

public SourceSubObject
{
    public int Age { get; set; }
}

目標

public class Target
{
public int SomeClassAge  { get; set; }
}

次に、1 つのオプションは、既定の設定でコピーできるプロパティをコピーし、残りを手動で行うことです。

var target = ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>().Map(source);
target.CompanyId = target.Company.CompanyId;

または、マッピングを再利用する必要がある場合は、カスタム マッパーを作成します。

カスタム マッパー

private Target Converter(Source source)
{
   var target = new Target();
   target.CompanyId = source.Company.CompanyId;
   return target;
}

使用法

var mapper = new DefaultMapConfig().ConvertUsing<Source, Target>(Converter);
var target = ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(mapper).Map(source);

アップデート

Role と RoleModel のマッピングについて。この場合、ディープ コピーを有効にする必要があり、クラス定義に応じて直接コピーするか、カスタム マッピングを行うことができます。

ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(new DefaultMapConfig().DeepMap<ClassToDeepMap>().DeepMap<ClassToDeepMap>()).Map(source, target);
于 2012-03-09T07:54:47.550 に答える
0
  • お世辞のために、私はEmit Mapperソースファイルのサンプルから構成を使用していました: http://emitmapper.codeplex.com/SourceControl/changeset/view/69894#1192663

  • Company クラスで一致する名前を作成するには、名前のフィールドにする必要があります。Id

  • へのマッピングList<Role>List<RoleModel>は、カスタムコンバーターを使用していました:

    public class EntityListToModelListConverter<TEntity, TModel>
    {
        public List<TModel> Convert(IList<TEntity> from, object state)
        {
            if (from == null)
                return null;
    
            var models = new List<TModel>();
            var mapper = ObjectMapperManager.DefaultInstance.GetMapper<TEntity, TModel>();
    
            for (int i = 0; i < from.Count(); i++)
            {
                models.Add(mapper.Map(from.ElementAt(i)));
            }
    
            return models;
        }
    }
    

    だから一緒に:

     var userMapper = ObjectMapperManager.DefaultInstance.GetMapper<User, UserModel>( 
                 new FlatteringConfig().ConvertGeneric(typeof(IList<>), typeof(IList<>), 
                 new DefaultCustomConverterProvider(typeof(EntityListToModelListConverter<,>))));
    
  • 問題があります。カスタム コンバーターで Flatterning Configuration を使用して、私の質問を確認してください: Emit Mapper Flattering with Custom Converters

于 2012-05-17T20:41:10.233 に答える