6

私はこれについてかなりの検索を行いましたが、まとまりのあるものを見つけることができませんでした. 私は比較的新しい開発者で、最初の専門的な開発職に就いたばかりです。基礎の領域でも学ぶべきことがたくさんあることを知っています。PodCast を聞いたり、ブログや論文を読んだりすることに基づいています。ソフトウェアを設計および構築するときに、関心の分離、IOC、依存性注入を念頭に置くことが正しいことのように思われることを理解するようになりました。私は概念を非常に高いレベルで理解しており、マイニングでこれを使ってできる限り取り組みたいと思っています。

だから、ここに摩擦があります。どうやってこのようにデザインするのですか?私は、非常に緊密に結合され、文書化が非常に不十分で、一般的にソフトウェアの保守が容易ではない Web ベースの製品を継承したチームで働いています。Evryone は、このカップルの一部を削除するというアイデアを気に入っているようです。彼らは、自動化されたテストを開発するというアイデアを気に入っています (私が読んだ限りでは、疎結合コンポーネントの方が簡単です)。誰もそれを行う方法を知らないようです。試してみたいのですが、アドバイスが必要です。私が見つけたものはすべて、常にこのことについて非常に高いレベルで話しているように見えます。逆に、全体のほんの一部に焦点を当てているようです. 本、一連のチュートリアル、ビデオ、または現実世界の例を取り上げてこれらの原則を適用する方法を示す何かについてのガイダンスが欲しい. 理想的には、

私が見つけた包括的なトレーニング資料のほとんどが、初​​心者がその日から良い実践を適用できるようにこのトピックを議論していないことに少し不満を感じています. 1。

お時間をいただきありがとうございます。

スティーブ

4

6 に答える 6

4

dimecasts.netの IoC スクリーンキャストを必ずチェックしてください。それらは非常に単純明快で、いくつかの概念を理解するのに役立ちます。

于 2008-11-19T16:49:42.920 に答える
4

私も同じ状況で、この2冊の本を買いました

(印刷用PDF版) http://www.manning.com/osherove/ および http://www.manning.com/prasanna/

于 2008-11-25T05:31:10.430 に答える
3

このブログ投稿で言及されている James Kovacs という本を読むことをお勧めします。1つは、あなたの状況にとって特に痛烈です。それが「レガシー コードを効果的に使用する」ことです。リファクタリングの概念について非常によく説明されています。また、C#、Java、および C++ ではありますが、非常に理解しやすいこれらの概念の例も示します。

于 2008-11-23T16:02:50.390 に答える
2

私は私たちが思いついたものだけを説明することができます。さまざまなオンラインライブラリからユーザビリティ構文などを借りてきましたが、コードはすべて私たちのものです。

基本的に、ServiceContainerと呼ばれるオブジェクトがあります。そのグローバルインスタンスが常に存在し、必要に応じてシングルトンコピーが静的に存在するため、Webアプリケーションでは、appdomain内のすべてのユーザー間で共有されます。

ServiceContainerにはルールが含まれています。ルールには、誰かがXYZタイプのオブジェクトを要求した場合、次のようにオブジェクトを提供する方法が示されています。

たとえば、一部のコードがIDbConnectionを実装するオブジェクトを取得するために、コンテナが新しいSqlConnectionオブジェクトを構築、構成、および返すというルールが考えられます。

したがって、問題のコードは、OleDbConnectionオブジェクトではなく、SqlConnectionオブジェクトを使用していることを認識せず、気にしません。

それを書いたので、これはあまり良い例ではないことに気付きました。最終的にはコマンドオブジェクトの接続を要求することになり、そのオブジェクトに与えるSQL構文は接続のタ​​イプに合わせて調整する必要があるからです。しかし、その点を今すぐ無視できる場合、コードはSQL Serverに接続していることを認識せず、接続オブジェクトがあることを認識しているだけです。

ここで問題となっているコードには、使用するコンテナー、つまりルールを指定する必要があります。これは、単体テストの観点から、ServiceContainerの新しいインスタンスを作成し、テスト目的でそのインスタンスに新しいルールを記述し、コードにその処理を依頼できることを意味します。最終的に、コードは(この場合は)SQlを実行する必要があり、実際のデータベースと通信する代わりに、IDbConnectionとIDbCommandのテスト実装を呼び出して、動作を確認する機会を与えてくれます。

さらに重要なことに、データベース全体をモックアップすることなく、テストに適合する既知のダミーデータを返す方法が提供されます。

さて、インジェクション部分については、この場合、他のオブジェクトに依存する、構築する必要のあるオブジェクトをコンテナに提供するように依頼できます。

たとえば、IDataAccessLayerインターフェイスとMSSQLDataAccessLayer実装があるとします。

インターフェイスは、ログを記録するという外見上の兆候を示しませんが、ここでの実際の実装には、実行するすべてのSQLをログに記録する場所が必要です。したがって、クラスのコンストラクターは次のようになります。

public MSSQLDataAccessLayer(ILogger logger) { ... }

ServiceContainerオブジェクトに、次のルールを登録しました(これは構文であり、他の場所では見つかりませんが、従うのは簡単です)。

ServiceContainer.Global.RegisterFactory<ILogger, FileLogger>()
    .FactoryScoped()
    .WithParameters(
        new Parameter("directory", @"C:\Temp")
    );
ServiceContainer.Global.RegisterFactory<IDataAccessLayer, MSSQLDataAccessLayer>()
    .FactoryScoped();

FactoryScopedは、コンテナにオブジェクトを要求するたびに、新しいオブジェクトを取得することを意味します。

私が英語で書いた場合のルールは次のとおりです。

  • ILoggerの実装が必要な場合は、新しいFileLoggerオブジェクトを作成し、「directory」パラメーターを必要とするコンストラクターを取得して、引数として「C:\Temp」を渡すときにそのコンストラクターを使用します。
  • IDataAccessLayerの実装が必要な場合は、新しいMSSQLDataAccessLayerを作成します

MSSQLDataAccessLayerのコンストラクターはILoggerを使用することを前に述べましたが、ここではパラメーターを指定していません。これにより、アクセスレイヤーオブジェクトを取得するための次のコードが得られます。

IDataAccessLayer dal = ServiceContainer.Global.Resolve<IDataAccessLayer>();

ここで何が起こるかというと、コンテナーオブジェクトは、オブジェクトがMSSQLDataAccessLayerであり、コンストラクターを持っていることを認識します。このコンストラクターにはILoggerオブジェクトが必要ですが、見よ、コンテナーはILoggerオブジェクトの作成方法を知っています。したがって、コンテナーは新しいFileLoggerオブジェクトを作成し、これをMSSQLDataAccessLayerオブジェクトのコンストラクターにサイレントに渡します。

したがって、アプリケーションの依存関係の多くの構成は、起動時に中央のどこかで実行できますが、残りのコードは、ここで発生するすべての魔法に気づいていません。

単体テストの目的で、ルールを書き直して、ログに記録されたテキストをメモリに保存するだけの独自のダミーロガーオブジェクトを提供できます。これにより、ログに記録する予定のコードが実際にログに記録されたことを簡単に確認できます。後でファイルします。

ルールは、オブジェクトインスタンスを実際に提供する方法について多くの力を与えてくれます。

  • デリゲート/メソッドから。つまり、必要に応じて、依存オブジェクトを自分で構築するすべての魔法を実行できます。
  • コンストラクターから自動的に(どちらを使用するかを自動的に判断するか、名前/タイプによって1つを選択するのに十分なダミーパラメーターを提供できます)
  • または、既存のインスタンスをコンテナに提供することもできます(これにより、シングルトンのようになります)

autofacを調べてから独自のシステムを作成しました。基本的には、呼び出し構文の例を示すwikiを見てから、座って、必要なことを実行する独自のシステムを作成しました。

于 2008-11-19T16:33:52.653 に答える
2

優れた単体テストの例を求めている人に対して回答したのと同じオープン ソース プロジェクトを紹介する必要があります。

広範な単体テストを備えた、*小規模*なオープン ソースの c# プロジェクトを探しています

CarTrackr を見ることをお勧めします。CarTrackr には、開発者が精通している必要のある幅広い .Net テクノロジ (特に Unity、MVC フレームワーク) があり、広範な単体テストが行​​われています。このプロジェクトは、1 回で消化できるほど単純ですが、実際には概念実証以上のものになるほど複雑です。コードプレックスの URL は http://www.codeplex.com/CarTrackrにあります。

于 2008-11-19T19:49:38.407 に答える
1

Ayendeによるこの記事は、私が今まで見た中で最高の IoC 入門です。

于 2009-01-13T16:12:22.103 に答える