所以我正在关注AutoInjector和Automapper在线的一些代码片段,并注意到一些我不太懂的东西。
在代码中,AutoInjector正在注册Automapper以便在此行中使用。
container.Register(() => config.CreateMapper(container.GetInstance));
我注意到container.GetInstance
没有传递任何内容。
经过一些修改后,我尝试在控制台应用中执行var instance = container.GetInstance();
,但它出现错误The type arguments for method 'Container.GetInstance<TService>() cannot be inferred from the usage. Try specifying the type arguments explicitly.
显然,传递的参数是从外部方法config.CreateMapper()
我想知道是否有办法逐步完成代码,以便我可以看到传递给container.GetInstance()
的内容。当我单步执行代码时,它只是跨过该行,并没有告诉我传递给方法的内容。
答案 0 :(得分:1)
CreateMapper
期望其参数为一个输入Type
并返回object
的函数。
Func<Type, object>
看起来container.GetInstance
就是这样一个功能。
由于您似乎对内部感兴趣,因此它们是:
public IMapper CreateMapper() => new Mapper(this);
public Mapper(IConfigurationProvider configurationProvider)
: this(configurationProvider, configurationProvider.ServiceCtor)
{
}
public Mapper(IConfigurationProvider configurationProvider, Func<Type, object> serviceCtor)
{
_configurationProvider = configurationProvider;
_serviceCtor = serviceCtor;
DefaultContext = new ResolutionContext(new ObjectMappingOperationOptions(serviceCtor), this);
}
答案 1 :(得分:1)
我注意到
container.GetInstance
没有传递任何内容。
因为什么都没有。 CreateMapper
的参数是委托,更具体地说是Func<Type, object>
;所以config.CreateMapper(container.GetInstance)
与你写的完全一样:
config.CreateMapper(type => GetInstance(type));
你当时没有传递任何具体论据,你只是简单地告知&#34; container
如何为任何给定的type
创建映射器,
它与这个简单的代码片段中的以下LINQ用法相同(因此可能重复注释):
public static string ToString<T>(T arg) => arg.ToString();
var ints = Enumerable.Empty<int>();
var strs = ints.Select(ToString); //or ints.Select(i => ToString(i))
ToString
来电中Select
传递了哪些参数?好吧,没有,你只是告诉Select
如何将int
映射到string
,你还没有处理任何整数(你无论如何也无法做到,枚举是空的!)。枚举枚举时,参数将传递给委托(或不传递)。
您的代码是相同的,只要需要为任何给定类型创建映射器,类型Type
(如果有)的参数将被传递到GetInstance
。您发布的代码与何时和 具体type
无关,这就是为什么在调试时您只需跨过该行。