如何解决循环依赖

时间:2016-05-24 12:48:27

标签: c# dependency-injection ninject service-layer

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;

    }

}

我遇到了两个班级相互依赖的情况。我正在使用Ninject。

Bind<INotificationService>().To<NotificationService>();
Bind<ILogService>().To<LogService>();

上述代码导致循环依赖。 解决这个问题的正确方法是什么?请分享一些代码。

2 个答案:

答案 0 :(得分:2)

循环依赖性表示软件中的设计或建模问题。虽然您可以使用属性注入来构造对象图,但是您将忽略根本原因并添加另一个问题:属性注入会导致Temporal Coupling

相反,解决方案是密切关注设计。通常你会发现有第三个隐藏的&#39;需要抽象的服务。这两项服务都可以依赖这项新服务。

由于您的问题仅仅是接口名称和组件之间的依赖关系是非常高级的,因此很难具体,但这是一个可能的解决方案:

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;
    }
}

答案 1 :(得分: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;
    }
}