2011-05-09 130 views
0

我建立使用Ninject和ASP.NET MVC應用程序3. 是否有可能與Ninject到這樣一個模塊內提供一個通用的綁定:Ninject通用綁定

Bind(typeof(IRepository<>)).To(typeof(SomeConcreteRepository<>)); 

編輯: 和那麼對於特定類型,創建一個繼承自SomeConcreteRepository的類:

Bind(typeof(IRepository<Person>)).To(typeof(PersonConcreteRepository)); 

這引發了一個例外情況,即多個綁定可用。但是,有沒有另一種方法呢?有沒有其他支持這種行爲的.NET的DI框架?

回答

1

手頭討厭的修復方案,但對於A位它的工作原理:

public class MyKernel: StandardKernel 
    { 
    public MyKernel(params INinjectModule[] modules) : base(modules) { } 

    public MyKernel(INinjectSettings settings, params INinjectModule[] modules) : base(settings, modules) { } 

    public override IEnumerable<IBinding> GetBindings(Type service) 
    { 
     var bindings = base.GetBindings(service); 


     if (bindings.Count() > 1) 
     { 
     bindings = bindings.Where(c => !c.Service.IsGenericTypeDefinition); 
     } 

     return bindings; 
    } 
    } 
+0

我使用了相同的方法,但我精煉了if語句以驗證是否存在一個非通用服務綁定 – 2012-05-14 15:50:41

3

你不需要第二行。只需註冊開放式泛型類型:

kernel.Bind(typeof(IRepository<>)).To(typeof(SomeConcreteRepository<>)); 

後來獲取特定的資源庫是這樣的:

var repo = kernel.Get<IRepository<Person>>(); 

,或者您也可以use a provider

+0

我覺得我的問題不是很清楚了:)參閱編輯 – sTodorov 2011-05-09 06:36:40

+0

@sTodorov,你看到的提供商鏈接我張貼在我的答案? – 2011-05-09 06:45:18

+0

是的,我非常感謝你。我目前正在考慮擴展提供者,或者創建一個定製的內核並重寫一些方法。會告訴你這件事的進展的。 – sTodorov 2011-05-09 06:54:49

0
public class ExtendedNinjectKernal : StandardKernel 
{ 
    public ExtendedNinjectKernal(params INinjectModule[] modules) : base(modules) { } 

    public ExtendedNinjectKernal(INinjectSettings settings, params INinjectModule[] modules) : base(settings, modules) { } 

    public override IEnumerable<IBinding> GetBindings(Type service) 
    { 
     var bindings = base.GetBindings(service); 

     //If there are multiple bindings, select the one where the service does not have generic parameters 
     if (bindings.Count() > 1 && bindings.Any(a => !a.Service.IsGenericTypeDefinition)) 
      bindings = bindings.Where(c => !c.Service.IsGenericTypeDefinition); 

     return bindings; 
    } 
}