web-dev-qa-db-ja.com

エンタープライズライブラリUnityと他のIoCコンテナ

Enterprise Library Unityと他のIoCコンテナー(Windsor、Spring.Net、Autofac ..)を使用することの長所と短所は何ですか?

133
Yoann. B

ユーザーグループのプレゼンテーションを準備しています。そういうものとして、私はちょうどそれらの束を通過しました。つまり、AutoFac、MEF、Ninject、Spring.Net、StructureMap、Unity、およびWindsorです。

90%のケースを見せたかった(コンストラクターインジェクション、これは主にIOCを使用するものです)。 ソリューションはこちら(VS2008)

そのため、いくつかの重要な違いがあります。

  • 初期化
  • オブジェクトの取得

それぞれに他の機能もあります(一部にはAOPと優れたギズモがありますが、一般的にIOCがオブジェクトを作成して取得するだけです)

注:CommonServiceLocatorを使用すると、異なるライブラリオブジェクトの取得の違いを打ち消すことができます。 http://www.codeplex.com/CommonServiceLocator

初期化は、コード経由またはXML構成(app.config/web.config/custom.config)の2つの方法で行われます。両方をサポートするものもあれば、1つだけをサポートするものもあります。私は注意する必要があります:IoCを支援するために属性を使用するものもあります。

だからここに違いの私の評価があります:

Ninject

コードの初期化のみ(属性付き)。ラムダが好きであることを願っています。初期化コードは次のようになります。

 IKernel kernel = new StandardKernel(
                new InlineModule(
                    x => x.Bind<ICustomerRepository>().To<CustomerRepository>(),
                    x => x.Bind<ICustomerService>().To<CustomerService>(),
                    x => x.Bind<Form1>().ToSelf()
                    ));

StructureMap

初期化コードまたはXMLまたは属性。 v2.5も非常にラムダ型です。全体として、これは私のお気に入りの1つです。 StructureMapが属性を使用する方法に関するいくつかの非常に興味深いアイデア。

ObjectFactory.Initialize(x =>
{
    x.UseDefaultStructureMapConfigFile = false;
    x.ForRequestedType<ICustomerRepository>()
        .TheDefaultIsConcreteType<CustomerRepository>()
        .CacheBy(InstanceScope.Singleton);

    x.ForRequestedType<ICustomerService>()
        .TheDefaultIsConcreteType<CustomerService>()
        .CacheBy(InstanceScope.Singleton);

    x.ForConcreteType<Form1>();
 });

nity

初期化コードとXML。素晴らしいライブラリですが、XML構成は苦痛です。マイクロソフトまたは高速道路店用の優れたライブラリ。コードの初期化は簡単です。

 container.RegisterType<ICustomerRepository, CustomerRepository>()
          .RegisterType<ICustomerService, CustomerService>();

Spring.NET

私が知る限り、XMLただし、Spring.Netは機能のために、IoCが実行できるすべての機能をSunの下で実行します。しかし、ユニット化する唯一の方法はXMLを使用することであるため、一般的に.netショップでは回避されます。ただし、多くの.net/Javaショップは、Spring.Netの.netバージョンとJava Springプロジェクト。

Spring.NET CodeConfig の導入により、コードの構成が可能になりました。

ウィンザー

XMLとコード。 Spring.Netのように、Windsorはあなたがやりたいことを何でもします。ウィンザーは、おそらく最も人気のあるIoCコンテナーの1つです。

IWindsorContainer container = new WindsorContainer();
container.AddComponentWithLifestyle<ICustomerRepository, CustomerRepository>("CustomerRepository", LifestyleType.Singleton);
container.AddComponentWithLifestyle<ICustomerService, CustomerService>("CustomerService",LifestyleType.Singleton);
container.AddComponent<Form1>("Form1");

Autofac

XMLとコードの両方を混在させることができます(v1.2を使用)。素敵なシンプルなIoCライブラリ。それほど大騒ぎせずに基本を行うようです。コンポーネントのローカルスコープと明確に定義されたライフタイム管理を備えたネストされたコンテナをサポートします。

初期化方法は次のとおりです。

var builder = new ContainerBuilder();
builder.Register<CustomerRepository>()
        .As<ICustomerRepository>()
        .ContainerScoped();
builder.Register<CustomerService>()
        .As<ICustomerService>()
        .ContainerScoped();
builder.Register<Form1>();

今日選択しなければならなかった場合、おそらくStructureMapを使用します。 C#3.0言語機能のサポートが最も優れており、初期化の柔軟性が最も高くなっています。

:Chris Brandsmaは、元の答えを ブログ投稿 に変えました。

233
Chris Brandsma

私が見た限り、それらはいくつかの実装の詳細をあちこちで除いてほとんど同じです。 Unityが競合に対して持つ最大の利点は、Microsoftによって提供されていることです。OSSを恐れている企業はたくさんあります。

欠点の1つは、かなり新しいため、古いプレーヤーが既に整理しているバグがある可能性があることです。

そうは言っても、 チェックアウト にしたいと思うかもしれません。

7
rodbv

古いスレッドですが、これはunity vs spring.netで入力したときにGoogleが最初に見せたものです...

XML設定が気に入らない場合、SpringはCodeConfigを実行します

http://www.springframework.net/codeconfig/doc-latest/reference/html/

また、Springは単なるDIコンテナではありません。ドキュメントの「モジュール」セクションを見ると、DIコンテナはそれが行う膨大なスタックの基盤です。

4
Richard

間違っている場合は修正してください。ただし、Autofac自体は、次のリンクにリストされているXML構成をサポートしていると思います。 Autofac XML構成

3
Felix Ngaserin

Springには、パラメーターの名前または位置に基づいて、コンストラクターまたはプロパティにパラメーターを注入できる機能が1つあります。これは、パラメーターまたはプロパティが単純なタイプ(整数、ブールなど)の場合に非常に便利です。 ここの例 を参照してください。これが、Springがコードで設定を行えないことを本当に補うとは思いません。

Windsorもこれを行うことができ、設定ではなくコードで行うことができます。 (間違っている場合は修正してください。ここで聞いたことを経由します)。

Unityでこれができるかどうか知りたいです。

2
Anthony

注意すべき点が1つあります。Ninjectは、(Webサイトごとに)コンテキスト依存の注入をサポートする唯一のIoCコンテナーです。ただし、他のIoCコンテナーの経験がないため、それが成り立つかどうかはわかりません。

2
ehsanullahjan

2セントを追加するために、StructureMapとUnityの両方を試しました。私はStructureMapが不十分/誤解されて文書化されており、設定するのが苦痛であり、使用するには不格好であることを発見しました。同様に、解決時のコンストラクター引数オーバーライドのようなシナリオをサポートしていないようです。これは私にとって重要な使用法のポイントでした。だから私はそれを落とし、Unityを使い、約20分でやりたいことをやらせました。

1
Repo Man

私はUnityを個人的に使用していますが、それはMicrosoftからのものだからです。私は1つの理由で決定を後悔しています:それに対して持っている最大のことは、常に例外を投げさせる1つの大きな「バグ」があります。デバッグ中は例外を無視できます。ただし、例外をスローするとコストのかかる操作になるため、アプリケーション全体を実行すると、アプリケーションの速度が大幅に低下します。たとえば、現在、Unityの例外がページのレンダリング時間に余分な4秒を追加するコードの1つの場所でこの例外を「修正」しています。詳細と回避策については、以下を参照してください。

常にUnityでSynchronizationLockExceptionをスローしないようにできますか?

1
Josh Mouch