[英]Generics and Property binding in Ninject
我正在尋找一種將設置合並到我的webapp(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返回的是BindingConfigurationBuilder,而不是IBindingWhenInNamedWithOrOnSyntax。 因此,castedResult始終為NULL。 有人知道如何糾正這個問題嗎?
最后編輯
我不知道為什么,但是突然間它起作用了! 很高興我終於明白了。 謝謝雷莫!
您有幾種選擇:
ISettings
類 ISettings
類以綁定所有接口。 並向Ninject添加一個自定義IActivationStrategy,它確實像NopCommerce那樣分配屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.