7

すべての静的メソッドを持つクラスAuthenticationManagerを持つコードを継承しました。依存関係注入を使用するために静的クラスをどのようにリファクタリングしますか?

ImはDIを導入し、非静的変数は静的メソッドから参照されるコンパイル時のエラーを取得イム今

UserController _userController; 

public AuthenticationManager(UserController userCont) 
{ 
    _userController = userCont; 
} 

UserControllerで

依存を取ったコンストラクタを追加したいです。このクラスと呼び出しコードの最小限の変更でこれを動作させることをお勧めしますか?

私はSimpleServiceLocatorをIOCコンテナとして使用しています。

+0

[シンプルインジェクター](http://simpleinjector.codeplex.com)にアップグレードする時間はありませんか?私はSimple Service Locatorの開発をやめました。 – Steven

+0

チップをありがとう - 私はシンプルインジェクターが存在することを知らなかった! Simple Injectorは私の質問に対処する余分な機能を提供していますか、それとも単なる良いことですか? –

+0

あなたの質問には答えませんが、Simple Injectorはより速く、より洗練されており、拡張機能を追加するためのサポートがはるかに優れています(ここで説明されているほとんどの高度なシナリオ(http://simpleinjector.codeplex.com/wikipage?title = Advanced-scenarios&referingTitle = Documentation)は、SSLで実装することはできません。コアの違いについては、SSL [here](http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=87)を参照してください。 – Steven

答えて

9

コード全体でどのくらいの頻度でクラスが使用されているかによって異なります。インスタンスメソッドで置き換える静的メソッドに一致するメソッドを含むIAuthenticationManagerインターフェイスを作成することをお勧めします。次に、インターフェイスを実装するAuthenticationManagerクラスを作成し、コンストラクタ経由でUserControllerの依存関係を受け入れることができます。

次に、すべての静的メソッド呼び出しサイトをインスタンスメソッドに置き換える必要があります。コンストラクタまたはプロパティを使用してIAuthenticationManagerをクラスに挿入することをお勧めします。必要な場合は、メソッドとしてIAuthenticationManagerをパラメータとしてコールサイトに渡すこともできます。

残念ながら、静的メソッドを置き換えるのはかなりリファクタリングが必要です。しかしそれは努力の価値がある。それはユニットテストのためのドアを開きます。

スタティックメソッドのいずれかのインターフェイスを抽出することで、一度に1つのメソッドをいつでもリファクタリングできます。各メソッドを一度に1つずつ実行して、リファクタリングに段階的にアプローチします(つまり、それぞれのメソッドは独自のインターフェイスを取得します)。

Working Effectively With Legacy Codeできる場合は、この本をご覧になることをおすすめします。このような状況のすべての種類をカバーする素晴らしい本。

関連する問題