1

我有一个用于桌面应用程序和网络应用程序的库。

这个库引用了一个外部数据访问组件,在桌面上应该绑定为单例,在 web 上应该在请求范围内。

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

今天我被迫在网络客户端上这样做:

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

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

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

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

4

1 回答 1

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();
    }
}

上面删除了强绑定语义。

于 2012-08-16T18:41:04.723 回答