2013-02-12 103 views
2

我正在尋找一種將設置合併到我的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!

回答

1

您有幾種選擇:

  1. 做到像NopCommerce和掃描設置類別和使用反射從你第一次編輯調用註冊方法。
  2. 使用約定延長登記使用自定義綁定發生器https://github.com/ninject/ninject.extensions.conventions/wiki/Projecting-Services-to-Bind
  3. 使用約定延長註冊實施ISettings綁定所有接口類實現ISettings所有類。並且添加一個自定義的IActivationStrategy到Ninject,它可以分配像NopCommerce這樣的屬性。