当 Ninject 遇到多重绑定(bind)解析问题时,有没有办法让 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 的接口(interface))。
目前我使用XML扩展将每个IProvideConnX映射到一个实现(每个IProvideConnX可以有多个实现),但是当用户想要更改连接类型时编辑XML文件是相当繁琐的。
我制作了一个小应用程序,帮助他们使用 Shiny 的按钮和所有内容修改 XML 文件,但我觉得应该有一种更动态的方式来做到这一点(Ninject 就是让我自己从 XML 中解放出来,对吧?)。
因此,我想使用程序集扫描器来发现所有可能的选择,并以某种方式告诉 Ninject 在运行时选择哪个绑定(bind)(取决于用户选择)。
有什么想法吗? (我查看了that solution,但我不知道如何使其适应无限数量的接口(interface)和实现)
最佳答案
不,你不能。但您可以配置绑定(bind),这样就不会发生这种情况:
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
关于.net - Ninject - 拦截多重绑定(bind)解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9669349/