2012-08-09 31 views
0

我正在尋找一種處理一系列對象的好方法,所以如果我使用基礎流的using語句來創建附件,那麼問題出現在GetMessage中...方法1當我去發送郵件消息的附件流被處置,並會收到一個錯誤。如果我脫掉使用的語句,它可以找到,但我沒有妥善處理DataStream Dest。我最初的做法是將一個參數List添加到方法一中,我可以在每次調用GetMessage時在方法1中添加Dest,並在方法結束時通過列表處理流。 SendMessage可以在批處理循環中調用,因此可能會創建很多流,我希望將它留給調用者(SendMessage)來處理它們而不是在GetMessage中,因爲SendMessage是發送的地方,我需要確保消息在處置之前已發送。有什麼建議麼???從調用者處理被調用方法中的流

   void sendMessage(MessageType type){ 
        MailMessage m = Method2(); 
        switch(type) 
        { 
         case type1: 
         m = Object1().GetMessage(param1) 
         case type2: 
         m = Object2().GetMessage(param1, param2) 
         case type3: 
         m = Object3().GetMessage(param1) 
         case type4: 
         m = Object4().GetMessage(param1, param2, param3) 
         case NewType5: 
         m = NewType5().GetMessage(param1, param2) 
        } 
        // this method does the send cause it has the mailmessage 
        m.Send(); 
       } 

       class NewType5() 
       { 
       MailMessage GetMessage(){ 

        // used to be 
        // using (var Dest = new DataStream(true)){ .... } 
        DataStream Dest = new DataStream(true); 

        // code that reads info into the stream 

        // Go back to the start of the stream 
        Dest.Position = 0; 

        // Create attachment from the stream 
        Attachment mailattachement = new Attachment(Dest, contentType); 

        //Create our return value 
        var message = new MailMessage(); 
        message.To.Add(UserInfo.UserDetail.Email); 
        message.Subject = "P&L Data View - " + DateTime.Now.ToString(); 
        message.Attachments.Add(mailattachement); 
        return message; 
       } 
      } 

要將發送到GetMessage我將不得不改變所有其他對象的所有其他對象實現。我寧願讓發送消息照顧新類型的處理5,因爲從批處理過程中可以稱爲500次。這是否使這個例子更清楚一點。發送消息已經被寫入一個實現對象是一個GetMessage實現的其他幾個對象。我恰好使用了一個流,並且在發送之前我不能處理流。

+0

只有兩種方法可以做到這一點:或者在Method2中進行處理,或者在Method1中創建/處理流並將其作爲參數注入到Method2中根據您的評論和當前給出的答案我只能得出結論(1)你沒有提供你的問題中的所有信息,(2)你的設計有缺陷。 – jeroenh 2012-08-09 14:25:40

+0

我只是簡單地添加一個新類型,其中的大部分代碼已經由其他人編寫。但是我的新類型需要通過流獲得的附件...所以我需要改變調用者SendMessage來處理從新類型的GetMessage處理流,但只有在我知道發送發生之後。我無法在所有其他對象類型上重寫其他GetMessage實現。我無法將該流用作GetMessage中的參數,因爲在get message消息調用之後再次將dispose放置,並且在switch語句之外完成發送。 – DRobertE 2012-08-09 14:55:54

回答

1

爲什麼不把它變成一個meth2的參數:?

  void method1(){ 
       using (var Dest = new DataStream(true)) 
       { 
        MailMessage m = Method2(Dest); 
        ..... 
        m.Send(); 
       } 
      } 

      MailMessage Method2(Stream Dest){ 

       // code that reads info into the stream 

       // Go back to the start of the stream 
       Dest.Position = 0; 

       // Create attachment from the stream 
       Attachment mailattachement = new Attachment(Dest, contentType); 

       //Create our return value 
       var message = new MailMessage(); 
       message.To.Add(UserInfo.UserDetail.Email); 
       message.Subject = "P&L Data View - " + DateTime.Now.ToString(); 
       message.Attachments.Add(mailattachement); 
       return message; 
      } 

是你的Message.Send()方法異步嗎?你想並行發送?

+0

Method2是一種從多種類型的對象中調用的接口方法,根據從中調用的對象方法2的類型,方法1中修改了郵件消息的其他方面。發送必須發生在方法1中,雖然這將是創建附件的方法發送消息的明顯選擇,但方法2的實現隨每個對象類型而變化,調用方或方法2總是知道一個mailmessage對象返回並知道要發送。 – DRobertE 2012-08-09 14:13:30

+0

你是什麼意思「它知道發送」?如何調用Method2的代碼知道對象WAS或WAS是否未發送,如果Method2()不接受控制參數並僅返回消息對象?對這個問題的回答決定了爲什麼/何時/如何處理流。 – quetzalcoatl 2012-08-09 14:18:56

+0

我編輯了上面的例子,希望能讓它更清晰一些...... – DRobertE 2012-08-09 14:45:09

1

我建議你在Method2中做MailMessage.Send;用你給出的代碼似乎沒有任何理由在調用方法中使用它。

+1

這將允許DataStream在Method2中正確放置並使用。 – 2012-08-09 14:02:14

+0

Method2是一種從多種類型的對象中調用的接口方法,根據從中調用的對象方法2的類型,方法1中修改了郵件消息的其他方面。發送必須發生在方法1中,雖然這將是創建附件的方法發送消息的明顯選擇,但方法2的實現隨每個對象類型而變化,調用方或方法2總是知道一個mailmessage對象返回並知道要發送。 – DRobertE 2012-08-09 14:14:05