当Ninject在多重绑定解析时遇到问题时,是否有办法调用函数?
基本上,我想有这个:
static void Main(string[] args)
{
StandardKernel k = new StandardKernel();
k.Bind<IProvideConn>().To<probe1>(); // these bindings are actually done by assembly scanner, I don't know how many types are available
k.Bind<IProvideConn>().To<probe2>();
k.Bind<plugin1>().ToSelf();
k.Get<plugin1>(); // Currently throws a "multiple bindings registered" exception
//but I would like it to call solveMyIssues.sortThingsOut
}
public class solveMyIssues
{
public IBinding sortThingsOut(IEnumerable<IBinding> availableBindingsForThisResolve)
{
int i = AskChoiceFromUser(availableBindingsForThisResolve);
return availableBindingsForThisResolve[i];
}
}
interface IProvideConn0
{
void goCrazy();
}
public class plugin1
{
public void talkWithUser(IProvideConn0 pc)
{
pc.goCrazy();
}
}
public class probe1 : IProvideConn0
{
public void goCrazy() {}
}
public class probe2 : IProvideConn0
{
public void goCrazy() {}
}
更多背景:
我在类似架构的插件中使用Ninject。插件可以使用一种或多种类型的连接提供程序(每个连接提供程序类型都有一个继承自IMotherConnProv的接口)。
目前,我使用XML扩展将每个IProvideConnX映射到一个实现(每个IProvideConnX可以有多个实现),但是当用户想要更改连接类型时编辑XML文件非常繁琐。
我创建了一个小应用程序,帮助他们使用闪亮的按钮和所有内容修改XML文件,但我觉得应该有更动态的方法(Ninject是关于从XML中解放出来的,对吗?)。 /> 因此,我想使用汇编扫描程序来发现所有可能的选择,并以某种方式告诉Ninject在运行时选择哪种绑定(取决于用户选择)。
有什么想法吗? (我看了that solution,但我看不出如何使它适应无限数量的接口和实现)
答案 0 :(得分:2)
不,你不能。但您可以配置绑定,以便不会发生:
kernel.Bind(
x => x.FromThisAssembly()
.SelectAllClasses().InheritedFrom<IProvideConn0>()
.BindToAllInterfaces()
.Configure((binding, componentType) => b.When(r => kernel.Get<IConfiguration>().ConnectionType == componentType.Name)));
kernel.Bind(
x => x.FromThisAssembly()
.SelectAllClasses().InheritedFrom<IConnectionType>()
.BindToAllInterfaces();
public class Configuration : IConfiguration
{
public Configuration(IEnumerable<IConnectionType> connectionTypes) { ... }
public string ConnectionType
{
get
{
return this.UserWhichConnectionDoYouWant(connectionTypes);
}
}
}
并为每个连接添加IConnectionType,指定必要的信息以便用户选择它。
请参阅https://github.com/ninject/ninject.extensions.conventions/wiki/What-is-configuration-by-conventions