2016-06-10 33 views
1

我已经使用MVVM在应用程序下面硬编码设置在一个循环解析相关:注册和

var ips = configFile.Read(); 

for (string ip in ips) 
{ 
    var tcpClient = new TcpClient(ip); 
    var stream = (Stream) tcpClient.GetStream(); 
    var service = new Service(stream); 
    var connectionViewModel = new ConnectionViewModel(service); 
    var extendedViewModel = new ExtendedViewModel(connectionViewModel); 
} 

甲数量的IP地址被从文件中读取,并且在视图模型的每个地址的结果被创建的显示来自IP的内容。

如果我想让DryIoc处理此问题,最佳方法是什么?所有new对象都是唯一的foreach循环。使用Func键通IP

回答

1

可能的选项:

var c = new Container(); 
c.Register<ExtendedViewModel>(); 
c.Register<ConnectionViewModel>(); 
c.Register<Service>(); 
c.Register<TcpClient>(); 

foreach (var ip in ips) { 
    var getVM = c.Resolve<Func<string, ExtendedViewModel>>(); 
    var vm = getVM(ip); 
    // use vm 
} 

更新:

对于流,添加下列注册不改变分辨率部分:

c.Register<Stream>(Made.Of(
    _ => ServiceInfo.Of<TcpClient>(), 
    tcpClient => (Stream)tcpClient.GetStream())); 

制造。与Func和其他包装器分辨率很好地玩,并且可以在对象图的中间。这就是为什么它比RegisterDelegate更可取。

+0

有趣。这是否唯一地解决了所有的依赖关系?我用流添加了一个问题的变体。答案可以修改以包含变体吗? – kasperhj

+0

我已经更新了我的答案。它解决了其余的依赖关系,通过从容器中解析它们而不是作为Func提供。 – dadhi

+0

谢谢。在注册TcpClient时,我收到一个错误:注册的一次性临时服务TcpClient {关键字}。我应该如何继续? – kasperhj