2012-08-09 117 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