2

Web アプリケーション (asp mvc) 内に設定を組み込む良い方法を探しています。NopCommerce で本当に素晴らしい実装に出会いました。NopCommerce は、値を名前と値とともにデータベース テーブルに保存します。名前は、クラスとプロパティ名から派生します (例: customersettings.settingname1)

NopCommerce が設定で動作する正確な方法は、この質問で見つけることができます:データベースから Nop Commerce 設定がどのように読み込まれるかを理解する

NopCommerce は Autofac を DI フレームワークとして使用して、次のように を にバインドSettingsConfigurationProviderます (私が正しいように)。

return RegistrationBuilder
                .ForDelegate((c, p) => c.Resolve<IConfigurationProvider<TSettings>>().Settings)
                .InstancePerHttpRequest()
                .CreateRegistration();

適切なクラスでパラメーターとして使用できるようClientSettingsになり、データベースからのデータが自動的に入力されます。

この実装は非常に柔軟なので、とても気に入っています。ただし、問題は、私が Ninject を使用していることです。正しいバインディングを取得するためにいくつかのことを試みましたが、正しい実装が見つからないようです。これを機能させる方法を知っている人はいますか?

編集

ClientSettings直接バインドする方法を見つけました:

kernel.Bind<ClientSettings>()
      .ToMethod(ctx => ctx.Kernel.Get<IConfigurationProvider<ClientSettings>>().Settings)
      .InRequestScope();

しかし、これを達成する方法はありますか?

kernel.Bind<ISettings>()
      .ToMethod(ctx => ctx.Kernel.Get<IConfigurationProvider<ISettings>>().Settings)
      .InRequestScope();

編集2

私は近づいていると思いますが、まだいくつかの問題に遭遇しています。カスタム バインディング ジェネレーターを作成します。

public class SettingsBindGenerator : IBindingGenerator
{
    static readonly MethodInfo BuildMethod = typeof(SettingsBindGenerator).GetMethod(
        "BuildRegistration",
        BindingFlags.Static | BindingFlags.NonPublic);      

    public IEnumerable<IBindingWhenInNamedWithOrOnSyntax<object>> CreateBindings(Type type, IBindingRoot bindingRoot)
    {
        var obj = typeof (object).IsAssignableFrom(type);
        if (type != null && typeof(ISettings).IsAssignableFrom(type))
        {
            var buildMethod = BuildMethod.MakeGenericMethod(type);
            var methodResult = buildMethod.Invoke(null, new object[]{bindingRoot});
            var castedResult = methodResult as IBindingWhenInNamedWithOrOnSyntax<object>;
            yield return castedResult;
        }
    }


    static IBindingWhenInNamedWithOrOnSyntax<TSettings> BuildRegistration<TSettings>(IBindingRoot bindingRoot) where TSettings : ISettings, new()
    {
        return bindingRoot.Bind<TSettings>().ToMethod(
            ctx => ctx.Kernel.Get<IConfigurationProvider<TSettings>>().Settings);
    }
}

これは 99% で機能します。ただし、何らかの理由で、buildMethod.Invoke は IBindingWhenInNamedWithOrOnSyntax ではなく、BindingConfigurationBuilder を返します。したがって、castedResult は常に NULL です。これを修正する方法を知っている人はいますか?

最終編集

理由はわかりませんが、突然機能します。やっと理解できてよかった。ありがとうレモ!

4

1 に答える 1

1

いくつかのオプションがあります:

  1. NopCommerce のように設定クラスをスキャンし、リフレクションを使用して最初の編集から登録メソッドを呼び出します。
  2. ISettingsカスタム バインディング ジェネレーターhttps://github.com/ninject/ninject.extensions.conventions/wiki/Projecting-Services-to-Bindを使用して実装するすべてのクラスを登録するには、規則拡張を使用します。
  3. 規約拡張を使用して、実装するすべてのクラスを登録しISettings、すべてのインターフェイスをバインドします。そして、NopCommerce のようにプロパティを割り当てるカスタム IActivationStrategy を Ninject に追加します。
于 2013-02-12T10:02:14.037 に答える