1

こんにちは、私の質問は少しばかげているかもしれませんが、誰かが私を助けてくれたらとても感謝しています.

だから私の質問は次のとおりです:自動クラスを設定しI+"Class" = "Class"て、ninjectを使用したルールと比較する方法は?

1 つのプロジェクトに多数のクラス class があり、それがインターフェイスであると想像してみましょう。

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

そしてまあまあ... 100のクラスとそのインターフェースを備えています。

各クラス バインディング ルールを記述するのは非常に面倒です。Castle Windsor のように自動的にバインドする方法が必要であることはわかっています。

ありがとう。私はNinjectでかなり新しいです。

誰かが例を提供する場合は特別なthx。

4

2 に答える 2

2

Ninject.Extensions.Conventionsを使用できます。これには、すべてIFooのsをsにバインドするデフォルトのバインダーがFooあり、もちろん、はるかに強力な規則を定義できます。

簡単な例:

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>();
        }
    }
}
于 2013-02-18T08:37:31.180 に答える
2

ルールでマッピングする必要はありません:

I+“Somevalue” = Somevalue

代わりに、リフレクションを使用して各クラスのインターフェイスを見つけることができます。以下のコードは、すべての型がアセンブリを実行していて、クラスの名前が「Class」で始まると想定しています。アプローチは次のようになります。

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);
}

ただし、規則に基づいて型をフィルター処理する方法を簡単に変更できます。

于 2013-02-18T08:26:36.963 に答える