2017-06-23 3 views
0

コントローラで接続文字列の実装が異なっています。コンストラクターに接続文字列を置くのはなぜですか?

一部は同じくらい簡単です:

public class tableNameController : Controller 
{ 
    private ConnectionStringName db = new ConnectionStringName(); 
    ... 

その他は以下のとおりです。

public class tableNameController : Controller 
{ 
    private ConnectionStringName db; 

    public tableNameController() 
    { 
     db = new ConnectionStringName(); 
    } 

は、コンストラクタに接続文字列を置くか、単にプライベート変数としてそれを残すことの利点はありますか?

+1

主に意見に基づいています。貧しいデザイン。コントローラをリーンにしておきます。インジェクションサービスはコントローラからコンテキストを保持します。 (免責事項:私は投票していませんでした**) – Nkosi

+0

@Nkosiあなたは依存性注入を示すよいチュートリアルを知っていますか? –

+0

どのバージョンのmvcを使用していますか? *またはコア? DI公式サイトである – Nkosi

答えて

6

.NETランタイムは実際にこれらのケースをまったく同じように処理します。それは同じILを生成するので、構文的に見栄えがよくなります。

ここでは、これをテスト可能かつクリーンにするためのその他の検討事項があります。私は、依存性注入とユニットテストに関するいくつかの研究を行います。

0

違いはありませんが、あなたはこの答えを見れば:https://stackoverflow.com/a/24558/5056173

kokosから良いルールは、あなたがコンストラクタでかいない初期化を使用すべきかどうかを決定するために、あります

  1. ドン宣言(null、false、0、0.0 ...)のデフォルト値で初期化されません。
  2. フィールドの値を変更するコンストラクタパラメータがない場合は、宣言で初期化を優先します。
  3. コンストラクタパラメータのためにフィールドの値が変化した場合、コンストラクタに初期化を入れます。
  4. あなたの練習で一貫してください(最も重要なルール)。
0

ベストプラクティスの観点から、どちらの方法も設計が不適切です。どちらの場合も、このコードはテストでカバーするのが難しいでしょう。次のアプローチを考えてみましょう:

public class TableNameController : Controller 
{ 
    private readonly ConnectionStringName _db; 

    public TableNameController(ConnectionStringName db) 
    { 
     _db = db; 
    } 
} 

は私もreadonly工事を追加している点に注意してください、それはあなたがconstructorを除き、誰がフィールドに値を設定することはできないことを確認してください役立ちます。また、そのアプローチでは、単体テストでは、虚偽のConnectionStringNameインスタンスをコンストラクタに渡すのは簡単です。

ベストプラクティスについて詳しく知りたい場合は、SOLIDDRYKISSIoCについてはgoogleをご覧ください。読みやすく、構造化され、保守しやすいコードを書くのに役立つアプローチ/プラクティスのリストです。

ところで、調査を開始することを恐れてはいないので、開発者は時には非常に複雑な方法で簡単なことについて話したいことがあります。

関連する問題