06-003 DependencyInjection 之 TypeActivator : ITypeActivator
Posted on 2015-03-24 16:08 DotNet1010 阅读(141) 评论(0) 收藏 举报接口的成员:
public interface ITypeActivator
{
object CreateInstance(IServiceProvider services, Type instanceType, params object[] parameters);
Func<IServiceProvider, object[], object> CreateFactory(Type instanceType, Type[] parameterTypes);
}
其中CreateInstance 是用来创建对象的。
如果所有的对象都添加到ServiceCollection里了,后面的parameters 可以不传入。
如果不想用ServiceCollection里,可以传入兼容的其它对象。
当然也可以部分传入,部分使用ServiceCollection里的。
如果有多个构造函数是怎么选择的呢?
foreach (var matcher in instanceType
.GetTypeInfo()
.DeclaredConstructors
.Where(c => !c.IsStatic && c.IsPublic)
.Select(constructor => new ConstructorMatcher(constructor)))
{
var length = matcher.Match(parameters);
if (length == -1)
{
continue;
}
if (bestLength < length)
{
bestLength = length;
bestMatcher = matcher;
}
}
对给定的 params object[] parameters 在构造函数中进行对应的类型查找。
如果找不到 自然是 length=-1. 如给没有 parameter length 是等于1的。
如果找到的话。比如给的第一个Parameter 在 第一个位置找到 这个时候 length=0
紧接着给的第二个Parameter在第二个位置找到 这个时候length=1;由此可见 length的最大值是 参数个数减1.
如果没有在第二个位置找到 在第三个位置找到了 这个时候length还是等于0.
最后选择的构造函数是:给定的类型在构造函数中完全找到的 顺序匹配最多的。具体实现参见类:ConstructorMatcher
构造函数的类型可以多,多的首先调用service.GetType()方法,然后 看是否有默认值,如果都不满足 抛出异常。
浙公网安备 33010602011771号