Enterprise Library Unity と他の IoC コンテナー (Windsor、Spring.Net、Autofac など) を使用する場合の長所と短所は何ですか?
ベストアンサー1
ユーザーグループ向けのプレゼンテーションを準備しています。そのため、いくつかのツールを試してみました。具体的には、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 つの方法で実行されます。両方をサポートするものもあれば、どちらか一方だけをサポートするものもあります。注意すべき点は、IoC を支援するために属性を使用するものもあります。
それで、違いについての私の評価は次のとおりです。
ニンジェクト
コードの初期化のみ (属性付き)。ラムダがお好きであれば幸いです。初期化コードは次のようになります。
IKernel kernel = new StandardKernel(
new InlineModule(
x => x.Bind<ICustomerRepository>().To<CustomerRepository>(),
x => x.Bind<ICustomerService>().To<CustomerService>(),
x => x.Bind<Form1>().ToSelf()
));
構造マップ
初期化コード、XML、または属性。v2.5 も非常に lambda 的です。全体的に見て、これは私のお気に入りの 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>();
});
団結
初期化コードと XML。素晴らしいライブラリですが、XML 構成は面倒です。Microsoft や高速道路のショップに最適なライブラリです。コードの初期化は簡単です。
container.RegisterType<ICustomerRepository, CustomerRepository>()
.RegisterType<ICustomerService, CustomerService>();
スプリング
私が知る限り、XML のみです。しかし、機能面では、Spring.Net は IoC で実行できるあらゆることを実行します。ただし、統合する唯一の方法が XML であるため、.net ショップでは一般的に避けられています。ただし、多くの .net/Java ショップでは、Spring.Net の .net バージョンと Java Spring プロジェクトが類似しているため、Spring.Net を使用しています。
注記: コード内での設定は、Spring.NET コード構成。
ウィンザー
XML とコード。Spring.Net と同様に、Windsor は必要なことなら何でも実行できます。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");
オートファック
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 言語機能のサポートが最も優れており、初期化の柔軟性も最も高いからです。
注記: クリス・ブランズマは、元の回答をブログ投稿。