2

アクティブな文化に基づく言語マッピングに Automapper を使用する方法を見つけました。

問題は、Resolver を使用するすべてのモデルをマップする汎用 Resolver を構築できるかどうかです。

この場合、マップするモデルは常に同じプロパティ Id と Name (言語プロパティ Name_PT、Name_FR および Name_EN を含む) を持ちます。

// モデル

public class MakeDto
{
    // Primary properties
    public int Id { get; set; }
    public string Name { get; set; }
    public string Name_PT { get; set; }
    public string Name_FR { get; set; }
    public string Name_EN { get; set; }
}

public class MakeViewModel
{
    // Primary properties
    public int Id { get; set; }
    public string Name { get; set; }
}

public class ModelDto
{
    // Primary properties
    public int Id { get; set; }
    public string Name { get; set; }
    public string Name_PT { get; set; }
    public string Name_FR { get; set; }
    public string Name_EN { get; set; }
}

public class ModelViewModel
{
    // Primary properties
    public int Id { get; set; }
    public string Name { get; set; }
}

public class FuelDto
{
    // Primary properties
    public int Id { get; set; }
    public string Name { get; set; }
    public string Name_PT { get; set; }
    public string Name_FR { get; set; }
    public string Name_EN { get; set; }
}

public class FuelViewModel
{
    // Primary properties
    public int Id { get; set; }
    public string Name { get; set; }
}

// オートマッパー プロファイル

public class DtoToViewModelMappingProfile : Profile
{
    public override string ProfileName
    {
        get { return "DtoToViewModelMappings"; }
    }

    protected override void Configure()
    {
        CreateMaps();
    }

    private static void CreateMaps()
    {
        Mapper.CreateMap<ModelDto, ModelViewModel>();
        Mapper.CreateMap<MakeDto, MakeViewModel>()
            .ForMember(dest => dest.Name, opt => opt.ResolveUsing<CultureResolver>());
        Mapper.CreateMap<FuelDto, FuelViewModel>();
    }

    public class CultureResolver : ValueResolver<MakeDto, string>
    {
        protected override string ResolveCore(MakeDto makeDto)
        {
            switch(Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName.ToUpperInvariant())
            {
                case "FR":
                    return makeDto.Name_FR;
                case "EN":
                    return makeDto.Name_EN;
            }
            return makeDto.Name_PT;
        }   
    }
}

ありがとう。

4

1 に答える 1

2

以下のようなインターフェースを抽出できます。

public interface ILocalizable
{
    string Name { get; set; }
    string Name_PT { get; set; }
    string Name_FR { get; set; }
    string Name_EN { get; set; }
}

public class FuelDto : ILocalizable
{
    // Primary properties
    public int Id { get; set; }
    public string Name { get; set; }
    public string Name_PT { get; set; }
    public string Name_FR { get; set; }
    public string Name_EN { get; set; }
}

次に、以下のようにリゾルバーを調整します。

public class CultureResolver : ValueResolver<ILocalizable, string>
{
    protected override string ResolveCore(ILocalizable dto)
    {
        switch(Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName.ToUpperInvariant())
        {
            case "FR":
                return dto.Name_FR;
            case "EN":
                return dto.Name_EN;
        }
        return dto.Name_PT;
    }   
}
于 2012-10-27T07:15:40.333 に答える