簡體   English   中英

Ninject中的泛型和屬性綁定

[英]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。 有人知道如何糾正這個問題嗎?

最后編輯

我不知道為什么,但是突然間它起作用了! 很高興我終於明白了。 謝謝雷莫!

您有幾種選擇:

  1. 像NopCommerce一樣操作,掃描設置類,並使用反射從第一次編輯中調用注冊方法。
  2. 使用約定擴展使用自定義綁定生成器https://github.com/ninject/ninject.extensions.conventions/wiki/Projecting-Services-to-Bind注冊所有實現ISettings
  3. 使用約定擴展注冊所有實現ISettings類以綁定所有接口。 並向Ninject添加一個自定義IActivationStrategy,它確實像NopCommerce那樣分配屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM