如果一个类需要在方法中需要时创建另一个类的多个实例,则依赖关系注入

本文关键字:实例 注入 另一个 关系 依赖 一个 如果 方法 创建 | 更新日期: 2023-09-27 18:20:43

嗨,我

正在学习进行依赖注入的最佳方法,并使用 IoC 容器来解决依赖关系。 但是,我遇到的大多数示例只需要其依赖项类的单个实例,并且此依赖项被注入到构造函数中。但我的场景有点不同。我有一个带有方法的类,该方法在循环中不断做一些工作,对于循环中的每次迭代,我需要创建一个不同类的新实例。在这种情况下,如何进行依赖关系注入? IoC 容器如何解决此问题?

感谢您的耐心等待

如果一个类需要在方法中需要时创建另一个类的多个实例,则依赖关系注入

就像 dkatzel 说的,使用factory .这就是我的做法。如果您正在创建 say 的实例,BaseViewModel

public interface IViewModelFactory {
    T Create<T>() where T : BaseViewModel;
}
public class ViewModelFactory : IViewModelFactory {
    private readonly Dictionary<Type, Func<BaseViewModel>> _factories;
    public ViewModelFactory(Dictionary<Type, Func<BaseViewModel>> factories) {
        _factories = factories;
    }
    public T Create<T>() where T : BaseViewModel {
        return _factories[typeof (T)]() as T;
    }
}

所以现在我们有一个可注射工厂,可以配置为创建和返回任何实现BaseViewModel的东西。

在 IoC 中,我们需要配置要返回的类型,因此想象一下这些视图模型(并注意第二个视图模型中的依赖关系(:

public abstract class BaseViewModel {
    // ...
}
public class FirstViewModel : BaseViewModel {
    // ...
}
public class SecondViewModel : BaseViewModel {
    private readonly ISomeDependency _injectedDependency;
    public SeoncdViewModel(ISomeDependency dependency) {
        _injectedDependency = dependency;
    }
}

并且(使用Autofac(我们像这样配置它:

var builder = new ContainerBuilder();
builder.Register(b => {
    var factories = new Dictionary<Type, Func<BaseViewModel>> {
        { typeof (FirstViewModel), () => new FirstViewModel() },
        { typeof (SecondViewModel), () => new SecondViewModel(b.Resolve<ISomeDependency>()) },
    };
    return new ViewModelFactory(factories);
}).As<IViewModelFactory>();

现在我们可以注入IViewModelFactory并创建FirstViewModelSecondViewModel的实例:

public class SomeClass {
    public readonly IViewModelFactory _factory;
    public SomeClass(IViewModelFactory factory) {
        _factory = factory;
        var secondViewModel = _factory.Create<SecondViewModel>();
    }
}

好的部分是 IoC 处理所有依赖项。 SomeClass只知道它有一个可以创建SecondViewModel的东西,所以SomeClass不需要知道SecondViewModels依赖项。

注入一个可以创建所需对象的Factory实例:

void doLoop(){
 for(;;){
    MyObj obj = factory.createNew();
  }
}