rak*_*esh 3 c# oop design-patterns dependency-injection inversion-of-control
嗨,我正在学习进行依赖注入以及使用 IoC 容器来解决依赖关系的最佳方法。然而,我遇到的大多数例子只需要它的依赖类的一个实例,并且这个依赖被注入到构造函数中。但我的场景有点不同。我有一个带有方法的类,它在循环中不断地做一些工作,并且在循环中的 foreach 迭代中,我需要创建一个不同类的新实例。在这种情况下如何进行依赖注入?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;
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在我们有一个可注入的工厂,可以配置它来创建和返回任何实现 BaseViewModel.
在 IoC 中,我们需要配置要返回的类型,因此想象一下这些视图模型(并注意第二个视图模型中的依赖项):
public abstract class BaseViewModel {
// ...
}
public class FirstViewModel : BaseViewModel {
// ...
}
public class SecondViewModel : BaseViewModel {
private readonly ISomeDependency _injectedDependency;
public SeoncdViewModel(ISomeDependency dependency) {
_injectedDependency = dependency;
}
}
Run Code Online (Sandbox Code Playgroud)
并且(使用 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>();
Run Code Online (Sandbox Code Playgroud)
现在我们可以注入IViewModelFactory和创建FirstViewModelor 的实例SecondViewModel:
public class SomeClass {
public readonly IViewModelFactory _factory;
public SomeClass(IViewModelFactory factory) {
_factory = factory;
var secondViewModel = _factory.Create<SecondViewModel>();
}
}
Run Code Online (Sandbox Code Playgroud)
好的部分是 IoC 处理所有依赖项。SomeClass只知道它有一个可以创建的东西,SecondViewModel所以SomeClass不需要知道SecondViewModels依赖关系。
| 归档时间: |
|
| 查看次数: |
2500 次 |
| 最近记录: |