NInject最简单的例子不起作用

时间:2015-07-08 14:05:51

标签: plugins ninject

我有三个项目:

  1. UI
  2. 插件管理
  3. PluginOne
  4. PluginTwo
  5. 在我的插件管理器中创建一个简单的插件界面:

    public interface IPlugin<T>
    {
        void sayMessage(T message);
        T createMessage();
    }
    

    所以,在我的其他项目中,我有两个IPlugin实现:

    In porject PluginOneProject -->
    -------------------------------
    public class PluginOne : IPlugin<IntMessage>
    {
    
        public void sayMessage(IntMessage message)
        {
            System.Console.WriteLine(message.ToString());
        }
    
    }
    
    where:
    
    public class IntMessage
    {
        private int message;
    
        public IntMessage(int message)
        {
            this.message = message;
        }
    
        public override string ToString()
        {
            return this.message.ToString();
        }
    }
    
    In porject PluginTwoProject -->
    -------------------------------
    public class PluginTwo : IPlugin<StringMessage>
    {
    
        public void sayMessage(StringMessage message)
        {
            System.Console.WriteLine(message.ToString());
        }
    
    }
    
    where:
    
    public class StringMessage
    {
        private String message;
    
        public StringMessage(String message)
        {
            this.message = message;
        }
    
        public override string ToString()
        {
            return this.message.ToString();
        }
    }
    

    显然,我已经添加了相应的项目引用。 所以,在我的UI项目中我有NInject,我执行这个约定映射:

    kernel.Bind(b => b.FromAssembliesMatching("*")
        .SelectAllClasses()
        .InheritedFrom(typeof(IPlugin<>))
        .BindAllInterfaces()
    );
    

    图表构建正确。 所以,我不知道如何从UI项目中获取PluginOne或PluginTwo的实例。

    我正在尝试使用此代码,但是,我遇到了通用接口的问题......

    foreach (IPlugin<?> plugin in kernel.GetAll(typeof(IPlugin<>)))
    {
        plugin.sayMessage(plugin.createMessage());
    }
    

1 个答案:

答案 0 :(得分:0)

不幸的是,您必须从Ninject请求特定的界面,因此您必须请求IPlugin<IntMessage>IPlugin<StringMessage>

我建议您尝试重构您的应用,以便您可以请求更通用的界面,例如IPlugin,和/或创建每条消息实现的消息接口,如IMessage。从你的问题中不清楚你想要完成什么。