【问题标题】:Dependency injection if a class needs to create multiple instances of another class when required in a method如果一个类在方法中需要时需要创建另一个类的多个实例,则依赖注入
【发布时间】:2014-09-05 13:36:20
【问题描述】:

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

感谢您的耐心等待

【问题讨论】:

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


    【解决方案1】:

    就像 dkatzel 所说,使用factory。这就是我的做法。如果您正在创建例如 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 的依赖关系。

    【讨论】:

    • 感谢您的详细回复。
    【解决方案2】:

    注入一个Factory 的实例,它可以创建你想要的对象:

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

    【讨论】:

    • 感谢您的快速回复。我有更多的场景here你能评论一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多