容器 DI 框架

雖然從程式碼中提取依賴關係以便注入它們會使程式碼更容易測試,但它會將問題推向層次結構的更高層次,並且還會導致難以構造的物件。已經編寫了各種依賴注入框架/ Inversion of Control Containers 來幫助克服這個問題。這些允許註冊型別對映。然後,當要求容器構造物件時,這些註冊用於解析依賴關係。

考慮這些類:

public interface ILogger {
    void Log(string message);
}

public class ConcreteLogger : ILogger
{
    public ConcreteLogger()
    {
        // ...
    }
    public void Log(string message)
    {
        // ...
    }
}
public class SimpleClass
{
    public SimpleClass()
    {
        // ...
    }
}

public class SomeProcessor
{
    public SomeProcessor(ILogger logger, SimpleClass simpleClass)
    {
        // ...
    }
}

為了構造 SomeProcessor,需要 ILoggerSimpleClass 的例項。像 Unity 這樣的容器有助於自動執行此過程。

首先需要構造容器,然後在其中註冊對映。這通常只在應用程式中完成一次。發生這種情況的系統區域通常稱為組合根

// Register the container
var container = new UnityContainer();

// Register a type mapping.  This allows a `SimpleClass` instance
// to be constructed whenever it is required.
container.RegisterType<SimpleClass, SimpleClass>();

// Register an instance.  This will use this instance of `ConcreteLogger` 
// Whenever an `ILogger` is required.
container.RegisterInstance<ILogger>(new ConcreteLogger());

配置容器後,它可用於建立物件,根據需要自動解析依賴項:

var processor = container.Resolve<SomeProcessor>();