Glue 框架的代码示例
本文关键字:代码 框架 Glue | 更新日期: 2023-09-27 17:55:23
谁能指出一些如何将 Glue 框架集成到项目中的完整代码示例? 我试图像AutoMapper一样使用它,因为我希望能够将一堆转换注册到Glue,然后任意递给它两个对象,让它从那里弄清楚。 该网站很好地说明了如何进行单个映射,但没有说明如何将它们集成到整个项目中。
当然,这一切都会被抽象出来,所以如果 Glue 变得太慢或映射框架需要更改,可以进行手动映射,但就目前而言,我看到的主要用例是创建大量Glue.Converter.IConverter
对象,并让您选择的 IoC 容器将它们注入到需要它们的地方。 这听起来不错,但如果这是我们使用的程序,我们的项目将需要几十个这样的零卡路里物体。
这需要大量的精雕细琢,但我照顾了它。
使用 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
对于常见用例来说更加理智。