キャッスルウィンザーとは何ですか?なぜ気にする必要がありますか?


190

私は長年のWindows開発者で、win32と初期のCOMに夢中です。2001年から.NETを使用しているため、C#とCLRにかなり精通しています。Stack Overflowに参加し始めるまで、Castle Windsorについて聞いたことはありませんでした。Castle Windsorの「Getting Started」ガイドを読みましたが、クリックしていません。

この古い犬に新しいトリックを教え、Castle Windsorをエンタープライズアプリに統合する理由を教えてください。


1
制御の反転について読んでください。初心者にとって、これは依存関係の分離を支援するのに非常に役立ちます。これは、単体テストの作成に非常に役立ちます。
Dan Csharpster 2013年

回答:


358

Castle Windsorは、制御ツールの反転です。それのような他のものがあります。

これにより、事前に構築および配線された依存関係を持つオブジェクトをすぐに入手できます。 「new」演算子ではなく、リフレクションと構成によって作成されたオブジェクトグラフ全体。

ここから開始:http : //tech.groups.yahoo.com/group/altdotnet/message/10434


メール送信クラスがあるとします。EmailSender。別のクラスWorkflowStepperがあるとします。WorkflowStepper内では、EmailSenderを使用する必要があります。

あなたはいつも言うことができます new EmailSender().Send(emailMessage);

しかし、それを使用するとnew、変更が困難なタイトカップリングが作成されます。(結局これは小さな人為的な例です)

それでは、WorkflowStepper内でこの悪い子を新しくする代わりに、コンストラクタにそれを渡した場合はどうなるでしょうか。

したがって、それを呼び出した人は誰でも、EmailSenderを新しくする必要がありました。

new WorkflowStepper(emailSender).Step()

たった1つの責任(google SRP)しか持たないこれらの小さなクラスが何百もあり、それらのいくつかをWorkflowStepperで使用するとします。

new WorkflowStepper(emailSender, alertRegistry, databaseConnection).Step()

EmailSenderあなたが書いているときの詳細WorkflowStepperや、AlertRegistry

あなたはあなたが取り組んでいる懸念について心配するだけです。

オブジェクトと依存関係のこの全体のグラフ(ツリー)が実行時に関連付けられることを想像してください。

WorkflowStepper stepper = Container.Get<WorkflowStepper>();

WorkflowStepper必要な場所に自動的に入力されるすべての依存関係を実際に扱うことができます。

ありません new

それはちょうど起こる -それは何が必要なものを知っているので。

そして、より優れた設計のDRYコードを使用して、テスト可能で再現可能な方法で欠陥を少なくすることができます。


30
驚くばかり!よく書かれました!今、私はそれについて興奮しています。
デビッドヒル

1
ありがとう。それにはもっとたくさんあります。私は非常にシンプルで痛々しいほど具体的な例を選びました。インターフェースを使用して、実装を切り替えることができます。アセンブリ全体を自動構成できます。シングルトンやHTTPリクエストごとなどのライフサイクルを指定できます。続行してください-作業が変わります。
Matt Hinze、

6
そしてJavaの人々を助けるために:これは.NETのGuiceです;-)
Mark Renouf

5
私の経験では、オブジェクトはどこで初期化されているので、デバッグが難しいと思いますか?-大規模なプロジェクトでは、初期化のルートを見つけるのは困難です。私は昔ながらの方法でを使用することを好みnewます。また、リフレクションを使用するアイデアも好きではありません。これは実際にはブラックボックスであり、私たちが所有していないコードであるため、完全には理解できません。
ルークTオブライエン

1
@nashwanはい私は単体テストを作成していますが、IoC / DIの原則はCastle Windsorやサードパーティのフレームワークなしで適用できます。私には、別の依存関係が追加されるだけで、それが私のコメントの要点でした。キャッスルウィンザーの利点はわかりません。
ルークTオブライエン


3

IoCは、生産性の向上と開発チーム(PM、BA、BOを含む)の楽しみへの道のりにおける正しい方向への足がかりになると思います。これは、開発者間の懸念とテストの分離を確立するのに役立ちます。それは、フレームワークが出入りする可能性があるので柔軟性を可能にする設計時に安心を与えます。

IoC(CWまたはNinjectなど)が狙う目標を達成するための最良の方法は、政治1と2を排除して、開発時に開発者が誤った理解のファサードを置く必要をなくすことです。これらの2つのソリューションはIoCに関連していないように見えますか?彼らです :)


3

Castle WindsorはDependency Injection container.、これを利用して、依存関係を注入し、新しいキーワードを使用してそれらを作成せずに使用できることを意味します。たとえば、リポジトリまたはサービスを作成し、それを多くの場所で使用したい場合は、最初にサービス/リポジトリを登録する必要があり、必要な場所に挿入した後で使用を開始できます。城のウィンザーを学ぶために私が従った以下のチュートリアルをご覧ください。

リンク

それがあなたを助けることを願っています。


1

簡単に言えば。コードに埋め込まれたクラスがあり、その機能を実行するためにいくつかの単純な構成値が必要だとします。つまり、そのクラスのインスタンスを作成するすべてのものはそれらの依存関係を取得する必要があるため、通常、インスタンスの作成場所にわずかな構成を渡すために、クラスのロードをリファクタリングする必要があります。

したがって、多くのクラスが不必要に変更されるか、構成値を1つの大きな構成クラスにまとめますが、これも悪いことです...または、最悪の場合でもService Locatorを使用してください!

IoCを使用すると、クラスはその手間をかけずにすべての依存関係を取得でき、インスタンスのライフタイムをより明示的に管理できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.