2009-11-19 3 views
7

IoCの世界で初めて、Winformsアプリケーションでの実装に問題があります。 MVCを使用する非常に基本的なアプリケーションWinformアプリケーションがあります。これは、すべての作業と作業中のダイアログ(コントローラを使用していることが明らかです)を行う1つのコントローラです。そこで私はすべてのクラスをprogram.csのIoCコンテナにロードし、コンテナを使用してメインフォームコントローラを作成します。しかし、これは私が問題を抱えているところです。私は、使用時に対話コントローラーを作成し、usingステートメントを作成したいだけです。WinformsでIoCを使用しているときにコンテナを回らない方法

最初はコンテナを渡しましたが、これは悪い習慣であり、コンテナは静的であり、このクラスを単体テストしたいと思っています。

私は抽象的な工場パターンを考えていましたが、コンテナを渡さずに単体テストのやり方でクラスを作成する方法はありますが、それだけでIoCを使用せずに問題を解決できます。私は有名なフレームワークを使用していないよ

、私は私がのIoCでこれを行うにはどうすればよい、このブログの記事からhttp://www.kenegozi.com/Blog/2008/01/17/its-my-turn-to-build-an-ioc-container-in-15-minutes-and-33-lines.aspx

を基本的なものを借りましたか?これはIoCの誤用ですか?

答えて

7

Kenの記事は非常に興味深いですが、このシナリオをサポートする数少ない「生産」IoCコンテナについてもっと学ぶ価値があります。例えばAutofacで

、あなたは、デリゲートとして工場「を生成」することができます

builder.RegisterGeneratedFactory<Func<IDialogController>>(); 

次に、あなたのメインフォームで:

class MainForm ... { 

    Func<IDialogController> _controllerFactory; 

    public MainForm(Func<IDialogController> controllerFactory) { ... } 

    void ShowDialog() { 
    using (var controller = _controllerFactory()) 
    { 
    } 
    } 

Autofacは、実行時にcontrollerFactoryコンストラクタのパラメータに入力されます。ユニットテストでは、ラムダをコンストラクタに簡単に渡すことができます。

1

私は一般に、ファクトリクラスへのインターフェイスを渡します。

+0

私はそれについて考えましたが、IoCの必要性を完全に取り除いていません。 –

+0

@ L2Type:IoC/DIはコンテナライブラリを必要としません。これはIoCです。しかし、それ自身が依存関係を持つ複数の依存関係を持つクラスを持っている場合は、コンテナライブラリがあなたを購入することを覚えておいてください。 – TrueWill

1

唯一合理的な解決策は、あなたのコンテナをシングルトンにすることです。 IoCフレームワークの中にはそういうものもありますが、あなた自身でSingletonの実装を展開しなければならないかもしれません。 Jon Skeetのideasを見てください。

WinformsでMVCで幸運を祈る。それは急上昇し始めている急な学習曲線です。

+0

私は仕事の前にWinFormsでMVCを実装しようとしましたが、かなりMVCではないハイブリッドソリューションで結局完成しました。それは一つの苦しい闘いです。 –

+0

IoCコンテナの利点の1つは、シングルトンを取り除くことです。生涯管理はコンテナによって処理されます。コンテナをシングルトンにすると、すべてのクラスがコンテナに結合され、クラスの依存関係が一目で分かりません。 – TrueWill

+0

私はクラスの依存関係をどのように見ることができないのかよく分かりません。私はアプリで単一のシングルトンを持たないことは非常に難しいと思う:)私はシングルトンをシングルトンで使わなければならないことを知っているが、それはwinforms app(そして中程度の複雑さのもの)のようにいくつかのケースで正当だと感じている。 そこにはコンテナの情熱と別に別のオプションがあり、それによってあなたのコードを汚染し、シングルトンコンテナを持っていますか? –

関連する問題