我正在尋找一種將設置合併到我的webapp(asp mvc)中的好方法。我在NopCommerce中遇到了非常好的實現。 NopCommerce將值存儲在數據庫表中,並帶有名稱和值。這個名字是從類和派生於屬性名稱(如customersettings.settingname1)Ninject中的泛型和屬性綁定
的確切方式NopCommerce可與設置都可以在這個問題上找到:Understanding how Nop Commerce settings are loaded from the database
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();
EDIT 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返回一個BindingConfigurationBuilder,而不是一個IBindingWhenInNamedWithOrOnSyntax。因此,castedResult始終爲NULL。有人知道如何糾正這個問題嗎?
最後的編輯
我不知道爲什麼,但突然它的工作原理!很高興我終於明白了。 Thanx Remo!