Ninject和Activator.CreateInstance - 缺少方法异常

时间:2013-11-05 16:26:27

标签: ninject activator

所以,我创建了一个类,它在我的项目中找到实现某个接口的所有类,然后生成这些类的实例,然后聚合从该接口的契约提供的方法的结果。

这是我的代码

    public string Parse(string src,JToken json)
    {
        var type = typeof(IReplaceTokens);
        var types = AppDomain.CurrentDomain.GetAssemblies()
            .SelectMany(s => s.GetTypes())
            .Where(t => type.IsAssignableFrom(t) && t.IsClass);

        return types.Select(tokenReplacer => Activator.CreateInstance(tokenReplacer) as IReplaceTokens)
            .Aggregate(src, (current, tokenReplacerInstance) => tokenReplacerInstance.ReplaceTokens(current, json));
    }

我从Activator获取了MissingMethod异常方法,因为它无法找到无参数的构造函数,但是这些类型的构造函数所需的两个参数应该由Ninject在绑定时注入。

来自我的NinjectModule

        Bind<IConfigReader>().To<JsonConfigReader>()
                             .InSingletonScope()
                             .WithConstructorArgument("appId", _appId)
                             .WithConstructorArgument("type", _type);

        var configReader = this.KernelInstance.GetService(typeof (IConfigReader)) as IConfigReader;
        if (configReader == null || configReader.JsonWrappedInExercise) { Bind<IJsonExtractor>().To<Pm3JsonExtractor>().InSingletonScope(); }
        else { Bind<IJsonExtractor>().To<NakedJsonExtractor>().InSingletonScope(); }

所有Constructors Activator的签名应该构建

public MonthTokenReplacer(IJsonExtractor extractor, IConfigReader reader)
public DateTokenReplacer(IJsonExtractor extractor, IConfigReader reader)
public LastNameTokenReplacer(IJsonExtractor extractor, IConfigReader reader) : base(extractor, "[[LastName]]", reader.FirstNameField) { }
public TokenReplacerBase(IJsonExtractor extractor, string token,string objectKey)

另外两个使用无参数构造函数。

知道为什么这不起作用吗?

1 个答案:

答案 0 :(得分:0)

通过调用Activator.CreateInstance来传递Ninject,就像使用new运算符一样。您有责任自己提供任何依赖。

改为呼叫kernel.Get(tokernReplacer)