.net - Ninject - 拦截多重绑定(bind)解析

标签 .net dependency-injection ninject

当 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/

相关文章:

javascript - 这两种声明 AngularJS Controller 的方式有什么区别?

java - 是否每个 Play 框架 Web 请求都使用新的依赖注入(inject) Controller 实例处理,但是静态 Controller 方法呢?

c# - x64 上的 TypeLoadException 但在具有 structlayouts 的 x86 上没问题

c# - 如果适用,将嵌套的 ForEach 替换为 Select

.net - 如何使用 MSBuild 指定 DLL 文件的输出目录

javascript - AngularJS,ui-路由器: Inject $stateParams into NOT anonymous function

ninject - 我需要向 Ninject.Web.MVC 3.0 注册 Ninject.OnePerRequestModule 吗?

c# - 在 Azure Functions 中使用 Ninject 确定 Entity Framework 的范围

asp.net-mvc - Ninject 绑定(bind)可以基于 URL/路由值吗?

.net - 模拟对象 - 将所有方法声明为虚拟方法还是使用接口(interface)?