导航

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()方法,然后 看是否有默认值,如果都不满足 抛出异常。