2016-05-24 10 views
0
public class NotificationService: INotificationService{ 

    private ILogService _logService; 

    public NotificationService(ILogService logService){ 

     _logService = logService; 

    } 

} 


public class LogService: ILogService{ 

    private INotificationService _notificationService; 

    public LogService(INotificationService notificationService){ 

    _notificationService = notificationService; 

    } 

} 

私は、2つのクラスが互いに依存する状況に遭遇しました。私はNinjectを使用しています。巡回依存関係を解く方法

上記のコードは周期的な依存関係を引き起こしています。 これを解決する適切な方法は何ですか?いくつかのコードを共有してください。クラスのいずれか(または両方)のための

+2

だけで簡単な質問:どのようにあなたがDIコンテナなしでこれらのクラスで作業しますか? – MaKCbIMKo

+0

@MaKCbIMKoは答えるべき重要な質問を提起する。 – Steven

+0

@MaKCbIMKo私はNinject IoCコンテナを使用しています – h3n

答えて

1

使用プロパティインジェクションは: Cyclic dependency with ninject

public class NotificationService: INotificationService{ 

    ILogService LogService { set; } 
} 


public class LogService: ILogService{ 

    private INotificationService _notificationService; 

    public LogService(INotificationService notificationService){ 
    { 
     notificationService.LogService = this; 
    } 
} 
2

循環依存は、お使いのソフトウェアで設計やモデリングの問題の指標です。プロパティインジェクションを使用してオブジェクトグラフを構築することはできますが、根本的な原因は無視し、別の問題を追加します。プロパティインジェクションの原因はTemporal Couplingです。

代わりに、解決策はデザインを注意深く見ることです。しばしば、抽象化される必要がある第3の「隠された」サービスがあることがわかります。どちらのサービスもこの新しいサービスに依存することができます。

あなたの質問は単なるインタフェース名とコンポーネント間の依存関係を持つ、非常に高レベルであるので、それは具体的には難しいのですが、ここで可能な解決策があります:

public class Logger : ILogger { } 

public class NotificationService : INotificationService{ 
    private ILogger _logger; 

    public NotificationService(ILogger logger){ 
     _logger = logger; 
    } 
} 

public class LogService : ILogService { 
    private ILogger _logger; 

    public LogService(ILogger logger){ 
     _logger = logger; 
    } 
} 
+0

私の場合、LoggerクラスはNotificationServiceとLogServiceに依存し、別の循環依存を作成します。 – h3n

関連する問題