Ninject - 拦截多重绑定分辨率

时间:2012-03-12 14:52:05

标签: .net dependency-injection ninject

当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,但我看不出如何使它适应无限数量的接口和实现)

1 个答案:

答案 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