2016-06-10 64 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