【问题标题】:Ninject and Activator.CreateInstance - Missing Method exceptionsNinject 和 Activator.CreateInstance - 缺少方法异常
【发布时间】:2013-11-06 01:49:10
【问题描述】:

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

这是我的代码

    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(); }

应构造的所有构造函数激活器的签名

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)

加上另外两个无参数构造函数。

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

【问题讨论】:

    标签: ninject activator


    【解决方案1】:

    通过调用Activator.CreateInstance,您可以像使用 new 运算符一样绕过 Ninject。您有责任自己提供任何依赖项。

    请致电kernel.Get(tokernReplacer)

    【讨论】:

    • 这很有帮助,非常感谢。我还需要调整我的类型集合,因为它包含一个基类。我做了那个摘要,然后将 !t.IsAbstract 添加到我的 where 子句中以进一步过滤
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多