我有一个可以在桌面应用和网络应用上使用的库。
此库具有对外部数据访问组件的引用,该组件应在桌面上绑定为单例,并且应在Web上处于请求范围。
今天我被迫在网络客户端上执行此操作:
Bind<ExternalComponent.IDataAccessComponent>()
.To<ExternalComponent.DataAccessComponent()
.InRequestScope()
.WithConstructorArgument(...);
在桌面客户端上,同样但InSingletonScope()
强制我的网页和桌面应用程序引用ExternalComponent.dll,这不是我的意图。
如何进行绑定,以便我可以从客户端(Web或桌面)指定我需要使用此外部组件的范围,而无需客户端引用此数据访问组件?
我正在考虑Core项目上的一些方法,它接收客户端需要的范围并设置所有内容,但我在Ninject API中找不到让我这样做的东西。
答案 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();
}
}
以上删除了强绑定语义。