How to solve Cyclic Dependency

一笑奈何 提交于 2019-12-12 00:05:53

问题


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;

    }

}

I came into a situation where two classes depends on each other. I am using Ninject.

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

The codes above are causing Cyclic Dependency. What is the proper way to solve this? Please share some codes.


回答1:


A cyclic dependency is an indication of a design or modeling problem in your software. Although you can construct your object graph by using property injection, you will ignore the root cause and add another problem: property injection causes Temporal Coupling.

Instead, the solution is to look at the design closely. Often you will find that there is a third 'hidden' service that needs to be abstracted. Both services can depend on this new service.

Since your question is quite high-level with just the interface names and the dependencies between the components, it's hard to be specific, but here's an possible solution:

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



回答2:


Use property injection for one (or both) of the classes: 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;
    }
}


来源:https://stackoverflow.com/questions/37414104/how-to-solve-cyclic-dependency

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!