0

Glue フレームワークをプロジェクトに統合する方法の完全なコード サンプルを教えてもらえますか? 私は、Glue への一連の変換を登録し、そこから把握するために 2 つのオブジェクトを任意に渡すことができるようにしたいという点で、AutoMapper のように使用しようとしています。この Web サイトでは、個々のマッピングを作成する方法については良いアイデアを提供していますが、それらをプロジェクト全体に統合する方法については説明していません。

もちろん、すべて抽象化されるため、Glue が遅くなりすぎたり、マッピング フレームワークを変更する必要が生じたりした場合は、手動でマッピングを行うことができますが、現在のところ、私が目にする主なユース ケースは、多くのGlue.Converter.IConverterオブジェクトを作成し、選択した IoC コンテナーを必要な場所に注入します。これは問題ないように思えますが、この手順を使用する場合、私たちのプロジェクトではこれらのゼロカロリー オブジェクトが何十個も必要になります。

4

1 に答える 1

0

これには大変な手間がかかりましたが、私はそれを処理しました。

TypeSwitchコードを使用して型を切り替えられるようにするために、最初に次のコードを書きました。

    public Mapping<Address, DatabaseAddress> DatabaseAddress { get; }
    public Mapping<T1, T2> GetMapping<T1, T2>()
    {
        Mapping<T1, T2> retMapping = null;
        TypeSwitch.Do(
            typeof (T1),
            TypeSwitch.Case<Address>(() =>
                TypeSwitch.Do(
                    typeof (T2),
                    TypeSwitch.Case<DatabaseAddress>(() => retMapping = AddressToDatabaseAddressMapping)
            ));

        return returnedMapping;
    }

retMapping = AddressToDatabaseAddressMappingに自動的に割り当てることができないため、コンパイラ エラーが発生してい Mapping<Address,DatabaseAddress>ましたMapping<T1,T2>。ここではヒューリスティックに同じものであったとしても、論理的に同じものではありません。

objectただし、型を活用することで、C# を動的言語として効果的に動作させることができます。

    public Mapping<Address, DatabaseAddress> DatabaseAddress { get; }
    public Mapping<T1, T2> GetMapping<T1, T2>()
    {
        object retMapping = null;
        TypeSwitch.Do(
            typeof (T1),
            TypeSwitch.Case<Address>(() =>
                TypeSwitch.Do(
                    typeof (T2),
                    TypeSwitch.Case<DatabaseAddress>(() => retMapping = AddressToDatabaseAddress),
            ));

        var returnedMapping = (Mapping<T1, T2>) retMapping;

        return returnedMapping;
    }

これは要点を示すのに必要以上に冗長ですがAddressToDatabaseAddress、静的な型がその必要性を暗示していなくても、実行時に はその ID を維持することに注意してください。そして、ヒューリスティックにMapping<T1, T2>ISMapping<Address, DatabaseAddress>であるため、実行時に適切に割り当てられ、完全に機能します。

ただし、作成して適切に動作TypeSwitchさせるにはtypeof(T1)、何かを追加する必要があることに注意することが重要です。渡さtypeof(T2)れるデフォルトでの記述方法は です。これは、必要な動作ではありません! ただし、次のオーバーロードを追加します。object sourceSystem.Type

    public static void Do(Type source, params CaseInfo[] cases)
    {
        foreach (var entry in cases.Where(entry => entry.IsDefault || entry.Target.IsAssignableFrom(source)))
        {
            entry.Action(source);
            break;
        }
    }

意図したとおりに動作します。System.Typeオーバーロードはオーバーロードよりも具体的であるため、System.Objectフレームワークはそれを使用することを好みます。誰かTypeSwitchがタイプを直接投げることを好む場合、一般的なユースケースでもう少し正気になります。

于 2013-01-28T16:13:26.333 に答える