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

C# 如果一个类需要在方法中创建另一个类的多个实例,则需要依赖项注入,c#,oop,design-patterns,dependency-injection,inversion-of-control,C#,Oop,Design Patterns,Dependency Injection,Inversion Of Control,大家好,我正在学习进行依赖项注入的最佳方法,并使用IoC容器来解决依赖项。然而,我遇到的大多数示例都是一个类只需要其依赖类的一个实例,并且该依赖关系被注入到构造函数中。但我的情况有点不同。我有一个类,它的方法在循环中不断地做一些工作,对于循环中的每次迭代,我需要创建一个不同类的新实例。在这种情况下,我如何进行依赖项注入?IoC容器如何解决这个问题 感谢您的耐心注入一个工厂的实例,它可以创建您想要的对象: void doLoop(){ for(;;){ MyObj obj = facto

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


感谢您的耐心

注入一个
工厂的实例
,它可以创建您想要的对象:

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

  }

}

正如dkatzel所说,使用
工厂
。我就是这样做的。如果您正在创建的实例,例如,
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;
    }
}
public class SomeClass {
    public readonly IViewModelFactory _factory;

    public SomeClass(IViewModelFactory factory) {
        _factory = factory;

        var secondViewModel = _factory.Create<SecondViewModel>();
    }
}
(使用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>();

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

感谢您的快速响应。我有进一步的情况,你能对此发表评论吗?谢谢你的详细回复。
public class SomeClass {
    public readonly IViewModelFactory _factory;

    public SomeClass(IViewModelFactory factory) {
        _factory = factory;

        var secondViewModel = _factory.Create<SecondViewModel>();
    }
}