容器 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
,需要 ILogger
和 SimpleClass
的例項。像 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>();