Web アプリケーション (asp mvc) 内に設定を組み込む良い方法を探しています。NopCommerce で本当に素晴らしい実装に出会いました。NopCommerce は、値を名前と値とともにデータベース テーブルに保存します。名前は、クラスとプロパティ名から派生します (例: customersettings.settingname1)
NopCommerce が設定で動作する正確な方法は、この質問で見つけることができます:データベースから Nop Commerce 設定がどのように読み込まれるかを理解する
NopCommerce は Autofac を DI フレームワークとして使用して、次のように を にバインドSettings
しConfigurationProvider
ます (私が正しいように)。
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 です。これを修正する方法を知っている人はいますか?
最終編集
理由はわかりませんが、突然機能します。やっと理解できてよかった。ありがとうレモ!