アプリで依存性注入を使用することはありません。依存性注入に関するいくつかの記事を読んだところ、その概念は興味深いものでしたが、実際に実装するのは難しいと思いました。今、win フォーム アプリに依存性注入を実装したいと考えています。
当社は現在、UPS、Fedex、Purolator などの多くの運送会社と協力していますが、将来的には他の多くの運送会社と協力する予定です。UPS、Fedex、Purolator などのすべての運送会社向けに個別のクラス ライブラリ プロジェクトを開発し、それらの dll をメイン フォーム アプリに含めました。問題は、多くの場合、国コードなどのコードにいくつかのことをハードコーディングすることです.
たとえば、4 つのボタンがあるフォームが 1 つあります。これらのボタンのように、「Ship with UPS WorldShip」、「Ship with UPS WebAPI」という別のボタン、「Ship with FedEX Desktop Apps」という別のボタン、「Ship with Fedex WebAPI」という最後のボタンがあります。
ユーザーが UPS WorldShip ボタンをクリックすると、フォルダにフラット ファイルが生成されます。ユーザーが UPS WebAPI ボタンをクリックすると、UPS サイトにリクエストが送信されます。
ユーザーが FedEX WinApps ボタンをクリックすると、フォルダにフラット ファイルが生成されます。ユーザーが FedEX WebAPI ボタンをクリックすると、要求が FedEx サイトに送られます。
したがって、ユーザーが任意のボタンをクリックすると、dll に存在する特定の関数を呼び出してタスクを完了します。
私の最後ではすべてが正常に機能していますが、問題は、当社が別の新しい運送会社と協力し始めたときに、その会社用に別のクラス ライブラリを作成する必要があることです。
アプリで DI を使用したことはなく、経験もないと言いました。そのため、新しい海運会社が参加するときにDIを使用して自分の状況をどのように処理できるかを教えてくれる人がいれば、余分なコードを書く必要はありません。アプリに DI を実装する方法を教えてください。また、ガイダンス用のサンプル DI コードを使用して状況を処理する方法も教えてください。
私の第二段階の質問
1) InitializeKernel() 関数を呼び出す必要がある場合 アプリケーションのロード時またはフォームのロード時
2)私はninjectに慣れていないので、このコード行の意味がわかりません
.Configure((b, c) => b.InTransientScope().Named(c.Name));
3) c.Name は何を返しますか?
4) 構成ファイルのエントリが見つかりませんでした。ninject は unity DI のような構成ファイルのエントリを必要としませんか?
あなたが与えたコードは非常にプロフェッショナルに見えます。可能であれば、私のすべてのポイントに答えてください。
最後に、DI と ninject コードの使用法を学習するために ninject で利用できる PDF があるか教えてください。
ありがとう
私の質問の第3段階
申し訳ありませんが、InitializeKernel() は一度宣言してください。
あなたは、Ninjectが流暢な構成をサポートするだけだと言いました。新しい運送会社が参加すると、このブロックのコードを
using(var kernel = InitializeKernel())
{
// 4.1 resolve delivery services by names
var upsWorldShip = kernel.Get<IShippingCompanyService>("ShippingUpsWorldShip");
var fedExDesktopApps = kernel.Get<IShippingCompanyService>("ShippingFedExDesktopApps");
var PurolatorExDesktopApps = kernel.Get<IShippingCompanyService>("PurolatorFedExDesktopApps");
// 4.2 delivery processing
upsWorldShip.Delivery();
fedExDesktopApps.Delivery();
// 5 PROFIT!
}
だからここにこの行を追加する必要があります
var PurolatorExDesktopApps = kernel.Get<IShippingCompanyService> ("PurolatorFedExDesktopApps");
問題は、新しい出荷関連の dll が追加されるたびに、上記のブロックに 1 行のコードを追加する必要があることです....これは望ましくありません。
すべてのdllの関連情報を構成ファイルに追加し、そこからすべてのdllからクラス化されたすべてをロードしてインスタンス化できれば、より良いでしょう。だから私はあなたの提案を探しています。ありがとう