我有三个项目:
在我的插件管理器中创建一个简单的插件界面:
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());
}
答案 0 :(得分:0)
不幸的是,您必须从Ninject请求特定的界面,因此您必须请求IPlugin<IntMessage>
或IPlugin<StringMessage>
。
我建议您尝试重构您的应用,以便您可以请求更通用的界面,例如IPlugin
,和/或创建每条消息实现的消息接口,如IMessage
。从你的问题中不清楚你想要完成什么。