2011-12-05 13 views
17

私はこのようなコードを書いているMark Seemannの本を読むと"Dependency Injection in .NET"特定の "new"が "foreign"なので、 "Bastard Injection"ですか?これは「バスタード注射のアンチパターン」の良い例ですか?

public class SessionInitServiceManager 
{ 
    protected readonly ICESTraceManager _traceManager; 
    protected readonly ILogger _logger; 
    protected readonly IAggregateCalls _aggregator; 
    protected readonly IMultiCoreRepository _repository; 

    public SessionInitServiceManager(ICESTraceManager traceManager, 
            ILogger logger, 
            IAggregateCalls aggregator, 
            IMultiCoreRepository repository) 
    { 
     _traceManager = traceManager; 
     _logger = logger; 
     _aggregator = aggregator; 
     _repository = repository; 
    } 

    public SessionInitServiceManager() : this(new CESTraceManager(), 
               new Logger("BusinessServices.authenticateUser"), 
               new Aggregator(), 
               new RepositoryFactory().BuildMultiCoreRepository()) { } 
+0

さておき、4つのパラメータが制限を推進しているとあなたがSessionInitServiceManagerがSRPに違反しているかどうかを質問するように強制するので、合理的なDI(作成者は自分の制限は一般に4であると述べています)。 – RichK

+0

はい、それを読んで3-4 IOCコンテナの有無にかかわらず、この新しい問題を回避する方法の良い例? –

+4

答えは、デフォルトの実装が同じライブラリ内で定義されているか、別のlibrで定義されているかによって異なりますary。 http://stackoverflow.com/questions/6733667/is-there-an-alternative-to-bastard-injection-aka-poor-mans-injection-via-defa/6739953#6739953 –

答えて

9

これは確かにバスタード注射の古典的な例のようです。理由は、あなたが4つの外国のデフォルトとして現れるものを持っているからです。外部デフォルトは、タイプが異なるモジュール/プロジェクト/ DLLから来るデフォルト値を指します。名前空間は将来のポイントで独自のモジュールにブレークアウトする境界を表すことができるので、私はその定義に名前空間を含めることになります。これは、ローカルのデフォルトを使用することを決定したときに、これを気にしています(今後これを独自のモジュールに分割しますか?)。

これがBastard Injectionではない方法は、これらすべてのクラスが同じモジュール内に存在することです。これを非常に悪いものにするのは、依存関係をドラッグして、あなたのクラスがこれらのクラスに緊密に結合されているからです。私自身のバージョンのロギングを使用することを選択した場合、私はロギングのためのDLLを取る必要があります。私は使用しませんが、モジュール化されたアプリケーション設計の利点を否定します。

+0

それは私にとってはうんざりです。ありがとう! –

0

私は友人から.NETの依存関係注入を借りたことがありました。私はあなたが何を言っているのかを見ます。私はこれが "野生の注射"だと信じています。残酷な言葉ですが、すべてのColdFusion(咳)に言語の一部として「CFABORT」タグが付いていると思います。

また、良い記事、ブログ記事How not to do dependency injection - the static or singleton containerに気付きました。

基本的に、私たちは始める前に、のは、道の外に何かを取得してみましょう!

依存性注入= IoCコンテナの使用これは、静的コンテナの誕生である「ここ

がキッカー、です」。代わりに、依存関係に取るために、コントローラのコンストラクタを変更するので、私たちはサービスが代わりにコンテナを使用して、それを解決するためにインスタンス化されている行を変更している。」

public class HomeController 
{ 
    private readonly IExampleService _service; 

    public HomeController() 
    { 
     _service = Container.Instance.Resolve<IExampleService>(); 
    } 

    public ActionResult Index() 
    { 
     return View(_service.GetSomething()); 
    } 
} 
+3

サービス・ロケータのパターンを実際に使用しているデフォルトのコンストラクタ内で、コンテナにIExampleServiceがあることをどのように知っていますか?それがなければ? IndexメソッドNullArgumentExceptionで、デザイン時には「きれいに」見えます。これはIoCコンテナを使用していません。これは間違った方法でDIを適用します –

関連する問題