私は長年のWindows開発者で、win32と初期のCOMに夢中です。2001年から.NETを使用しているため、C#とCLRにかなり精通しています。Stack Overflowに参加し始めるまで、Castle Windsorについて聞いたことはありませんでした。Castle Windsorの「Getting Started」ガイドを読みましたが、クリックしていません。
この古い犬に新しいトリックを教え、Castle Windsorをエンタープライズアプリに統合する理由を教えてください。
私は長年のWindows開発者で、win32と初期のCOMに夢中です。2001年から.NETを使用しているため、C#とCLRにかなり精通しています。Stack Overflowに参加し始めるまで、Castle Windsorについて聞いたことはありませんでした。Castle Windsorの「Getting Started」ガイドを読みましたが、クリックしていません。
この古い犬に新しいトリックを教え、Castle Windsorをエンタープライズアプリに統合する理由を教えてください。
回答:
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コードを使用して、テスト可能で再現可能な方法で欠陥を少なくすることができます。
new
ます。また、リフレクションを使用するアイデアも好きではありません。これは実際にはブラックボックスであり、私たちが所有していないコードであるため、完全には理解できません。
Mark Seemannは、IOCのサブセットであるDI(Dependency Injection)に関する優れた本を書いています。彼はまた、いくつかのコンテナを比較します。この本はあまりお勧めできません。本の名前は次のとおりです。「。Netでの依存性注入」https://www.manning.com/books/dependency-injection-in-dot-net
IoCは、生産性の向上と開発チーム(PM、BA、BOを含む)の楽しみへの道のりにおける正しい方向への足がかりになると思います。これは、開発者間の懸念とテストの分離を確立するのに役立ちます。それは、フレームワークが出入りする可能性があるので柔軟性を可能にする設計時に安心を与えます。
IoC(CWまたはNinjectなど)が狙う目標を達成するための最良の方法は、政治1と2を排除して、開発時に開発者が誤った理解のファサードを置く必要をなくすことです。これらの2つのソリューションはIoCに関連していないように見えますか?彼らです :)
簡単に言えば。コードに埋め込まれたクラスがあり、その機能を実行するためにいくつかの単純な構成値が必要だとします。つまり、そのクラスのインスタンスを作成するすべてのものはそれらの依存関係を取得する必要があるため、通常、インスタンスの作成場所にわずかな構成を渡すために、クラスのロードをリファクタリングする必要があります。
したがって、多くのクラスが不必要に変更されるか、構成値を1つの大きな構成クラスにまとめますが、これも悪いことです...または、最悪の場合でもService Locatorを使用してください!
IoCを使用すると、クラスはその手間をかけずにすべての依存関係を取得でき、インスタンスのライフタイムをより明示的に管理できます。