c# - 如果一个类需要在方法中需要时创建另一个类的多个实例,则进行依赖注入(inject)

标签 c# oop design-patterns dependency-injection inversion-of-control

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

感谢您的耐心等待

最佳答案

如 dkatzel 所说,使用工厂。这就是我的处理方式。如果您正在创建 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;
    }
}

现在我们有了一个可注入(inject)工厂,可以配置它来创建和返回任何实现 BaseViewModel 的东西。

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

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>();

现在我们可以注入(inject) 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 依赖关系。

关于c# - 如果一个类需要在方法中需要时创建另一个类的多个实例,则进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25687195/

相关文章:

c# - 用于查找 List<List<int>> 最大值的 Linq 表达式?

javascript - Child.prototype = Parent.prototype 与 Child.prototype = new Parent()

.net - 将 .net 对象的类更改为子类

c++ - 运行时的策略模式?

javascript - 选择的插件不起作用

c# - 通过编程从 Windows 计算机获取所有更新

java - 如何使这部分代码可扩展,

c++ - 关于单例

postgresql - 如何使用 PostgreSQL 和 Umlauts 的不区分大小写的模式匹配?

c# - 在 View 中显示 Tuple<int, int> 值