我有一个WPF应用程序,当它启动时,查看文件系统中的一些配置文件
对于它找到的每个配置文件,它会在不同的窗口中显示一些信息
每个窗口都有一个关联的ViewModel对象,该对象绑定到windows datacontext
因此为每个配置文件创建了一个新的ViewModel。表示配置文件中数据的对象将传递给viewmodels构造函数
但是,View模型还有其他依赖项传递给构造函数
代码看起来像这样(在从app.xaml启动的引导程序中)
foreach (WindowConfig config in ConfigManager.GetConfigs())
{
IMyService svc = new MyService();
//change to resolve from IoC container
MyViewModel vm = new MyViewModel(config, svc);
Window1 view = new Window1();
view.DataContext = vm;
window.show();
}
我想使用Castle IoC contaoiner解决这些依赖关系。我知道如何为IMyService做到这一点,但我怎么能为从配置文件创建的特定类做到这一点?
感谢
答案 0 :(得分:8)
永远记住,在应用程序代码中,从容器中拉出永远不是解决方案。 应用程序代码应该不知道正在使用DI容器。
在您的情况下,工厂可能看起来像这样(假设您的config
变量是字符串:
public interface IViewModelFactory
{
IViewModel Create(string configuration);
}
现在,您可以将IViewModelFactory作为单个依赖项注入循环配置文件的类中。
要实现IViewModelFactory,您可以手动执行,也可以使用Castle Windsor的Typed Factory Facility为您实现。
答案 1 :(得分:2)
您可以将参数传递给Windsor,它应该在解析构造函数时使用,使用IWindsorContainer.Resolve
作为参数的IDictionary
重载。在这个字典中,键应该是参数名称,值应该是用作参数值的对象:
var arguments = new Dictionary<string,object> {{ "config", config }, { "service", svc } };
var viewModel = container.Resolve<MyViewModel>(arguments);