2013-02-18 68 views
1

你好,我的問題可能有點愚蠢,但我會非常感激,如果有人會幫助我。設置ninject比較規則我+「Somevalue」= Somevalue

所以我的問題是:如何設置自動類與接口比較規則I+"Class" = "Class"使用ninject?

讓我們想象一下,我們在一個項目中有很多類的類,它是接口。

Class class1 : Iclass1{..} 
Class class2 : Iclass2{..} 
Class class3 : Iclass3{..} 

以及等等......有一百個類和它的接口。

爲每個類綁定規則寫一個相當厭煩,我知道應該有一個自動的方式來綁定它,就像在溫莎城堡。

Thx,很多。我在Ninject很新。

特別thx如果有人會提供一個例子。

回答

2

你並不需要與規則映射:

I+「Somevalue」 = Somevalue 

相反,你可以使用反射來找出每個類的接口,代碼如下假設所有類型是在執行程序集和您的類的名字與「類」開始,這種方法是很類似:

var types = Assembly.GetExecutingAssembly().GetTypes() 
        .Where(t => t.Name.StartsWith("Class")); 

foreach (var type in types) 
{ 
    var interfaceType = type.GetInterfaces() 
          .Single(); 

    kernel.Bind(type).To(interfaceType); 
} 

,但很容易,你可以改變過濾根據您的約定你的類型的方式。

+1

感謝哦100S。我怎麼沒有從開始就得到它。 :) – Maris 2013-02-18 08:28:07

2

您可以使用Ninject.Extensions.Conventions - 它有一個默認聯編程序,它將所有IFoo s與Foo s綁定起來,當然您可以定義更強的約定。

簡單的例子:

using Ninject; 
using Ninject.Extensions.Conventions; 

namespace NinjectConventionsDemo 
{ 
    public interface ITool { } 
    public class Tool : ITool { } 

    internal class Program 
    { 
     private static void Main() 
     { 
      IKernel kernel = new StandardKernel(); 
      kernel.Bind(convention => convention 
              .FromThisAssembly() 
              .SelectAllClasses() 
              .BindAllInterfaces() 
       ); 
      var tool = kernel.Get<ITool>(); 
     } 
    } 
} 
+0

這一個不適合我。 – Maris 2013-02-18 10:11:01

+0

@Maris - 嗯,這是一個例子。但擴展應該完全符合你的要求。像上面的例子一樣,你所有的類都是'internal'嗎?這可以解釋爲什麼它不起作用。 – Kobi 2013-02-18 10:14:19

+0

噢,好的。無論如何。 – Maris 2013-02-18 10:15:12

相關問題