Glue框架的代码示例?

时间:2013-01-22 21:26:13

标签: c# .net type-conversion

有人能指出一些如何将Glue framework集成到项目中的完整代码示例吗?我试图使用它有点像AutoMapper,因为我希望能够将一堆转换注册到Glue,然后任意交给它两个对象,让它从那里找出来。该网站很好地了解了如何制作单独的映射,而不是如何将这些映射整合到整个项目中。

当然,它会被抽象掉,所以如果Glue变得太慢或需要更改映射框架,那么可以进行手动映射,但是现在我看到的主要用例是创建了很多Glue.Converter.IConverter个对象并拥有您选择的IoC容器将它们注入到需要它们的任何地方。这听起来不错,但如果这是我们使用的程序,我们的项目将需要几十个这样的零卡路里对象。

1 个答案:

答案 0 :(得分: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将保持其身份,即使其静态类型并不意味着它需要至。而且,启发式地,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对于常见用例会更加明智。