Ninject指定非引用组件的绑定范围

时间:2012-08-16 14:22:05

标签: ninject ninject.web ninject-3

我有一个可以在桌面应用和网络应用上使用的库。

此库具有对外部数据访问组件的引用,该组件应在桌面上绑定为单例,并且应在Web上处于请求范围。

  • 桌面项目引用核心项目
  • Web项目引用核心项目
  • 核心项目引用ExternalComponent

今天我被迫在网络客户端上执行此操作:

Bind<ExternalComponent.IDataAccessComponent>()
     .To<ExternalComponent.DataAccessComponent()
     .InRequestScope()
     .WithConstructorArgument(...);

在桌面客户端上,同样但InSingletonScope()强制我的网页和桌面应用程序引用ExternalComponent.dll,这不是我的意图。

如何进行绑定,以便我可以从客户端(Web或桌面)指定我需要使用此外部组件的范围,而无需客户端引用此数据访问组件?

我正在考虑Core项目上的一些方法,它接收客户端需要的范围并设置所有内容,但我在Ninject API中找不到让我这样做的东西。

1 个答案:

答案 0 :(得分:1)

我不确定为什么这是必要的,但只有在使用接受System.Type的语法时才有可能:

public class CoreModule : NinjectModule
{
    public override void Load()
    {
        this.Extend(this.Bind(typeof(IDataAccessComponent)).To(typeof(DataAccessComponent))).WithConstructorArgument("foo", "bar");
    }

    protected virtual IBindingNamedWithOrOnSyntax<object> Extend(IBindingInSyntax<object> bindingWhenInNamedWithOrOnSyntax)
    {
        return bindingWhenInNamedWithOrOnSyntax;
    }
}

public class WebClientModule : CoreModule
{
    protected override IBindingNamedWithOrOnSyntax<object> Extend(IBindingInSyntax<object> bindingWhenInNamedWithOrOnSyntax)
    {
        return bindingWhenInNamedWithOrOnSyntax.InRequestScope();
    }
}

public class ClientModule : CoreModule
{
    protected override IBindingNamedWithOrOnSyntax<object> Extend(IBindingInSyntax<object> bindingWhenInNamedWithOrOnSyntax)
    {
        return bindingWhenInNamedWithOrOnSyntax.InSingletonScope();
    }
}

以上删除了强绑定语义。