1

デスクトップ アプリと Web アプリの両方で使用するためのライブラリがあります。

このライブラリには、デスクトップではシングルトンとしてバインドする必要があり、Web ではリクエスト スコープにする必要がある外部データ アクセス コンポーネントへの参照があります。

  • デスクトップ プロジェクトはコア プロジェクトを参照します
  • Web プロジェクトの参照コア プロジェクト
  • コア プロジェクトは ExternalComponent を参照します

今日、私はWebクライアントでこれを行うことを余儀なくされています:

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

デスクトップクライアントでも同じですが、InSingletonScope()これにより、WebアプリとデスクトップアプリがExternalComponent.dllを参照するようになりますが、これは私の意図ではありません。

クライアントがこのデータ アクセス コンポーネントを参照することなく、この外部コンポーネントが必要なスコープをクライアント (Web またはデスクトップ) から指定できるように、バインディングを作成するにはどうすればよいですか?

クライアントが必要とするスコープを受け取り、すべてを設定する Core プロジェクトのいくつかのメソッドを考えていますが、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 に答える