将对象初始化添加到IoC容器,而不引入循环依赖

时间:2012-12-04 15:12:58

标签: c# inversion-of-control ioc-container

我有一个知道如何刷新Math组件的类(MathController) 该类使用辅助类来根据时间表确定何时触发刷新。

我想要做的是将助手类添加到我的IoC容器中。

目前,IoC创建了MathController。由于辅助类需要从MathController接收Action,我不知道如何在不进入循环依赖方案的情况下执行此操作。

这是我作为场景示例创建的示例。

void Main()
{
    var mathController = new MathController();
}

class MathController
{
    private readonly StateMonitor _stateMonitor;

    public MathController()
    {
        _stateMonitor = new StateMonitor(RefreshMath);
        _stateMonitor.Monitor();
    }

    public void RefreshMath()
    {
        Debug.WriteLine("Math has been refreshed");
    }
}

class StateMonitor
{
    private readonly Action _refreshCommand;

    public StateMonitor(Action command)
    {
        _refreshCommand = command;
    }

    public void Monitor()
    {
        Debug.WriteLine("Start monitoring");
        Thread.Sleep(5000);
        Debug.WriteLine("Something happened, we should execute the given command");
        _refreshCommand();
    }
}

1 个答案:

答案 0 :(得分:2)

您的IoC容器可能支持某种方式来执行此操作。例如,NInject允许您注册一个可以为您处理初始化的提供程序(基本上是一个工厂方法)。如果你说哪个IoC容器和放大器可能会有帮助。你正在使用的版本。

另一种方法是将StateMonitorFactory注入MathController,而不是StateMonitor本身。然后工厂将构建StateMonitor。所以MathController可能看起来像:

public MathController(StateMonitorFactory fact)
{
    _stateMonitor = fact.CreateStateMonitor(RefreshMath);
    _stateMonitor.Monitor();
}

第三种选择是让StateMonitor具有初始化方法。在这种情况下,StateMonitor构造函数将变为无参数,但您将使用Start(Action command)之类的签名向其添加另一个方法,并且MathController将负责调用它。