2

我有兩個場景,我想用Ninject.Extensions.Conventions解決。如何使用Ninject慣例綁定服務

第一個是一個簡單的問題:每當從包含單詞「service」的名稱空間請求一個實例時,返回唯一匹配類的單例實例。我試着像這樣:

Kernel.Bind(service => service.FromThisAssembly() 
           .Select(theClass => theClass.Namespace.Contains("Service")) 
           .BindDefaultInterface() 
           .Configure(binding => binding.InSingletonScope())); 

其中一些服務得到解決,但我碰上ActivationException當分辨率鏈達到一個地步,Impl1IService2的依賴。

這個綁定有什麼問題?


第二一個可能是同樣簡單。所有繼承BaseClass的類都應通過方法實例化。這是我以前到現在的分辨率代碼,做每類:

Bind<MyViewModel>().ToMethod(ctx => fac.CreateProxy<MyViewModel>()) 
        .InSingletonScope(); 

[注:在這種情況下,FAC是一個自定義的工廠,建造城堡代理]

哪有我從ViewModelBaseExtensions.Conventions繼承的班級做這樣的事情?

我想出了選擇部分已經在這裏。

Kernel.Bind(ViewModel => ViewModel.FromThisAssembly() 
            .Select(t => t.BaseType == typeof(ViewModelBase)) 
           ); 

現在我需要的是工廠採取行動......


一般問題:

  1. Extensions.Conventions的結合的方法似乎是準確的正常的反向:

    • Ninject:Bind <Interface>() . To <Implementation>()

    • 約定:SelectAllClasses().BindDefaultInterface()

      爲什麼會這樣,還是我誤解呢?

  2. 我曾經把我的綁定從NinjectModule派生的類,而且我preferrably繼續這樣做。在使用Extensions.Conventions時沒有這樣做的原因?

+0

關於你的第一個例子你可以發佈一個示例如何嘗試解析服務名稱類型? – nemesv

+0

這裏有一個示例,第一個代碼片段 –

+0

沒有那是註冊部分,我對如何使用/解析註冊類型感興趣,因此您得到'ActivationException' – nemesv

回答

4

第一: 請後確切ActivationException消息+堆棧跟蹤。 很可能缺少IService2的綁定或存在循環依賴關係。

第二: 使用一個綁定發生器:

public override void Load() 
    { 
     this.Bind(x => x 
      .FromThisAssembly() 
      .SelectAllClasses() 
      .InheritedFrom<BaseClass>() 
      .BindWith<ToSelfProxyBindingGenerator>() 
      .Configure(binding => binding.InSingletonScope())); 
    } 

    public class ToSelfProxyBindingGenerator : IBindingGenerator 
    { 
     public IEnumerable<IBindingWhenInNamedWithOrOnSyntax<object>> CreateBindings(Type type, IBindingRoot bindingRoot) 
     { 
      yield return bindingRoot 
       .Bind(type) 
       .ToMethod(ctx => fac.CreateProxy(type)); 
     } 
    } 

還要注意的是單範圍可以通過使用.Configure(..)方法IBindingGenerator或@慣例來定義。

一般問題

  1. 你是正確的,但我不能告訴你它背後的確切理由。
  2. 不,將約定放入不同的模塊是完全正確的。我們也這樣做,它完美地運作。
+0

感謝您的回覆。首先,感謝示例代碼 - 它工作正常。不過,我有時需要用其他參數調用'fac.CreateProxy(type)'。我怎麼能通過這些?有點違背常規思維,是不是我? –

+0

依賴於特定類型的附加參數肯定超出了約定範圍。根據成本,您可以選擇將它們過濾出來並單獨綁定它們,也可以調整BindingGenerator以查找參數並傳遞它們。有沒有辦法一般地確定參數(通過反射,...)以及如何獲得參數的值(可能通過依賴注入?)?您可能需要查看https://github.com/ninject/ninject.extensions.factory並查看參數標識和解決方法是如何完成的。 – BatteryBackupUnit

+0

非常感謝,您的代碼和解釋幫助了我很多! –