【问题标题】:Using Ninject create an instance of an interface使用 Ninject 创建接口的实例
【发布时间】:2016-09-18 05:53:24
【问题描述】:

在我们的中间件中,接口绑定在Global.asax.cs 中。我创建了一个HandshakeInvoker,它反映了所有FieldInfo,直到找到实现IESFPingable的接口。当它找到一个时,我需要创建该接口的一个实例,然后调用提供程序中的 ping() 类。我的问题是,一旦找到匹配项,我就无法创建界面。

Global.asax.cs 绑定:

kernel.Bind<IAccountProvider>().To<AccountProvider>().InSingletonScope();

HandshakeInvoker:

public object Invoke(object instance, object[] inputs, out object[] outputs)
{
    outputs = new object[0];
    Type interfaceType = typeof(IESFPingable);

    FieldInfo[] fields = serviceType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
    foreach (FieldInfo f in fields)
    {
        if (interfaceType.IsAssignableFrom(f.FieldType))
        {
            Console.WriteLine("  >> Field {0} Implements {1}", f.fieldType.Name, interfaceType.Name);
            var interfaceToPing = kernel.Get<f.FieldType.Name>();
        }
    }
    return DateTime.Now;  //return date for now
}

我收到错误:

当前上下文中不存在名称“内核”和类型 或命名空间名称 'f' 找不到(您是否缺少 using 指令...)

有人看到我做错了什么吗?非常感谢所有帮助。

编辑:我们使用 Ninject 来实例化我们的接口。我被告知我应该需要使用 kernel.Get。反射将接口作为字符串 (f.FieldType.Name) 返回,这会在 Get 中引发错误。但除此之外,我在 kernel.Get 中放什么并不重要。我收到类型或命名空间错误。我试过做 键入 myType = Type.GetType(f.FiedlType.Name) 并输入 kernel.Get 并得到相同的错误。我已经尝试了一百种不同的东西,其他人也没有运气。有人告诉我,这篇文章提到的通用答案不使用 Ninject,也不会在这里工作。

我只需要在另一个程序集中的提供程序类中调用一个方法。接口/提供程序包含在 Global.asax 的绑定中,但无论我们尝试什么,它都不起作用。我很沮丧。我需要使用 DependencyResolver 吗?这甚至不可能吗?它必须是可能的。

【问题讨论】:

标签: c# reflection kernel ninject


【解决方案1】:

这效果更好。我不需要创建接口的新实例。

    public object Invoke(object instance, object[] inputs, out object[] outputs)
    {
        outputs = new object[0];

        Type interfaceType = typeof(IESFPingable);
        Type T = instance.GetType();
        FieldInfo[] fields = T.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
        foreach (var f in fields)
        {
            var result = f.GetValue(instance);

            if (result is IESFPingable) 
            {
                (result as IESFPingable).Ping();
            }
        }
        return DateTime.Now; //temporary
    }

【讨论】:

    猜你喜欢
    • 2016-08-13
    • 2023-04-08
    • 2011-10-30
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多