1

私はアプリケーションを開発しており、NInject フレームワークを使用して依存関係の問題を解決していますが、コンストラクターが大きすぎます。一部のコンストラクターには、5、8、10 個のパラメーターがあります。これを解決するために、私にはアイデアがあります..

代わりに、このようなクラスをコードします。

public class UserBLL
{
    private IA a;
    private IB b;
    ...
     UserBLL(IA a, IB b, IC c ...)
    {
        this.a = a;
        this.b = b
        ...
    }   

}

クラスをこのようにコーディングすると思います。

    public class UserBLL
    {
        private IA a;
        private IB b;
        ...
         UserBLL(IKernel kernel)
        {
            this.a = kernel.Get<IA>();
            this.b = kernel.Get<IB>()
            ...
        }   

    }

それが良いアイデアかどうか、そして将来直面する問題があるかどうかを知りたい.

4

4 に答える 4

1

2番目の例では、コンストラクターをまったく単純化していません。依存関係を追加しましたこれは良い考えではありません。コンポーネントは、ではなく、依存するインターフェースに依存する必要がありますIKernel

クラスに8〜10の依存関係がある場合、それはクラスがやりすぎていることを示している可能性があります。

于 2013-02-04T16:50:35.680 に答える
1

IKernel に組み込まれたビジネス インターフェイスの依存関係を注入することをお勧めします

いいえ、それは良い習慣ではないと思います。夕食工場IKernelとして使用しようとしていますが、コード内のあらゆる場所への依存関係も作成していることを忘れないでください。これはビジネス クラスではなく、インフラストラクチャ クラスです。IKernel

あなたの場合、単一責任の原則に違反する可能性があります。この場合、クラスをより小さなクラスに分割することが最適です。

于 2013-02-04T16:53:34.440 に答える
0

IKernelいいえ、インスタンスを注入することはできません。

他のコンポーネントを任意に解決できるコンポーネントを注入することは、Service Locatorと呼ばれ、アンチパターンと見なされます。

Service Locatorの最悪の点は、特定のクラスが何に依存しているかが明確でなくなったことです。これにより、メンテナンスの問題が発生します。これはすぐには明らかではないかもしれませんが、後で問題になります。

サービスロケーターを使用するのが得策ではない理由についての良い記事があります:http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx

コンストラクターにパラメーターが多すぎるという問題については、設計を変更することを検討してください。ほとんどの場合、これは、Iain Gallowayが彼の回答で示唆したように、単一責任原則を適用する際の問題です。基本的に、現在のクラスの依存関係になるが、同時に既存の依存関係の一部を「盗む」ことになる、別々のクラスの独立したロジックの断片を分解することを試みることができます。

したがって、たとえば、クラスに10個の依存関係がある場合、ロジックを3つのクラス( 、、および)Aに分割できます。これらのそれぞれには、以前は直接使用されていた3〜4の依存関係が含まれている可能性があります。BCDA

3〜4の依存関係も多すぎると思われる場合は、これらの小さなクラスの依存関係でもこのプロセスを繰り返すことができます。

于 2013-02-04T17:08:04.370 に答える
0

ここには良いアイデアの芽があると思いますが、私はこのように実装しません。カーネル オブジェクトの目標は、状況を鈍くするのではなく、より明確にすることです。たとえば、次のようにします。

interface IKernel 
{
    public IA GetIA();
    public IB GetIB();      
}

注1:私はさらに進んで、実際にそれらがインターフェースにあるものを説明します:

interface IKernel
{ 
   public IA GetUserUIPreferences();
   public IB GetPrintingParameters();
}

注 2: IKernel の実装には、注入される機能が含まれることを期待しています。そうでなければ、DI を使用する意味はありません

于 2013-02-04T16:52:28.463 に答える