有人能指出一些如何将Glue framework集成到项目中的完整代码示例吗?我试图使用它有点像AutoMapper,因为我希望能够将一堆转换注册到Glue,然后任意交给它两个对象,让它从那里找出来。该网站很好地了解了如何制作单独的映射,而不是如何将这些映射整合到整个项目中。
当然,它会被抽象掉,所以如果Glue变得太慢或需要更改映射框架,那么可以进行手动映射,但是现在我看到的主要用例是创建了很多Glue.Converter.IConverter
个对象并拥有您选择的IoC容器将它们注入到需要它们的任何地方。这听起来不错,但如果这是我们使用的程序,我们的项目将需要几十个这样的零卡路里对象。
答案 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
对于常见用例会更加明智。