Glue 框架的代码示例

本文关键字:代码 框架 Glue | 更新日期: 2023-09-27 17:55:23

谁能指出一些如何将 Glue 框架集成到项目中的完整代码示例? 我试图像AutoMapper一样使用它,因为我希望能够将一堆转换注册到Glue,然后任意递给它两个对象,让它从那里弄清楚。 该网站很好地说明了如何进行单个映射,但没有说明如何将它们集成到整个项目中。

当然,这一切都会被抽象出来,所以如果 Glue 变得太慢或映射框架需要更改,可以进行手动映射,但就目前而言,我看到的主要用例是创建大量Glue.Converter.IConverter对象,并让您选择的 IoC 容器将它们注入到需要它们的地方。 这听起来不错,但如果这是我们使用的程序,我们的项目将需要几十个这样的零卡路里物体。

Glue 框架的代码示例

这需要大量的精雕细琢,但我照顾了它。

使用 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将保持其标识,即使其静态类型并不意味着它需要。 而且由于启发式地,Mapping<T1, T2>Mapping<Address, DatabaseAddress>,它将在运行时正确分配自己并完美工作。

但是,重要的是要注意,我必须在TypeSwitch中添加一些东西才能使typeof(T1)typeof(T2)正常工作。 默认情况下,传入object source的编写方式是System.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对于常见用例来说更加理智。