0

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

当然,这一切都会被抽象出来,因此如果 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即使它的静态类型并不意味着它需要它,它也会保持它的身份。而且,由于启发式地Mapping<T1, T2>是 IS 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更喜欢直接输入类型,那么对于一个常见的用例来说会更加理智。

于 2013-01-28T16:13:26.333 回答