Общие функции в VB.Net - PullRequest
       12

Общие функции в VB.Net

1 голос
/ 12 сентября 2009

Я должен отправлять электронные письма, когда человек получает личное сообщение на моем веб-сайте, и для этого я использую StringBuilder для создания HTML-разметки электронной почты.

также, поскольку это требуется во многих других местах, я также создал общую функцию (я использую VB.NET). Теперь меня беспокоит только то, что общие функции совместно используются всеми объектами и, возможно, сессиями asp.net. Может ли быть так, что до того, как один человек сформирует электронную почту, а другой человек получит доступ к той же функции, это приведет к тому, что данные в строителе строк станут перезаписать ..

В настоящее время на моем сайте мало пользователей, но это может стать проблемой в будущем ... Пожалуйста, сообщите мне об этом ... Есть ли лучший способ или стандартная процедура, которой необходимо следовать при использовании общих функций?

Также однажды я допустил ошибку при использовании общего объекта соединения, и это вызвало бы близость, если бы многие люди имели к нему доступ.

Ответы [ 3 ]

3 голосов
/ 12 сентября 2009

Совместно используемые функции могут обращаться только к статическим / глобальным переменным, а также к переменным внутри области действия функции. Поэтому, если функция работает с любым количеством статических / общих ресурсов, вам необходимо синхронизировать вызовы этой функции.

В вашем случае, однако, не похоже, что вы работаете с какими-либо общими ресурсами, так что это не должно быть проблемой.

Вот пример, иллюстрирующий проблему:

 private static myCounter As Integer = 0

 public shared function IncreaseCount() As Integer
    myCounter += 1

    for i as integer = 0 to 10 million
      //'do extensive work
    next

    return myCounter
 End Function

Представьте, что вы вызываете функцию в первый раз и ожидаете, что она вернет число 1. Но из-за того, что функция была вызвана снова до того, как первый вызов функции вернул счетчик, была увеличена еще раз Это означает, что оба вызова функции возвращают 2 вместо 1 и 2. Все проблемы возникают, когда вы хотите, чтобы несколько вещей работали на одном и том же статическом ресурсе.

2 голосов
/ 12 сентября 2009

Вместо использования статического метода вы можете прикрепить объект EmailSender к текущему HttpContext. Таким образом, у каждого пользователя будет свой экземпляр EmailSender. Вот код в C #:

private static EmailSender _instance;
public static EmailSender GetEmailSender()
{
if(System.Web.HttpContext.Current != null)
{
    if(! System.Web.HttpContext.Current.Items.ContainsKey("EmailSender"))
       System.Web.HttpContext.Items["EmailSender"]=new EmailSender();\
    return (EmailSender)System.Web.HttpContext.Current.Items["EmailSender"];

}
if(_instance==null)
   _instance=new EmailSender();
return _instance;
}

Будет работать в веб-приложениях и приложениях Windows. Теперь каждый раз, когда вы хотите отправить электронное письмо, вы можете сделать следующее:

GetEmailSender().SendMail(MailInfo mailInfo);
1 голос
/ 13 сентября 2009

Кроме того, если вы используете VB.NET в Framework 3.5, возможно, вы захотите изучить использование литералов XML для построения своего HTML вместо StringBuilder. Литералы XML сделают ваш код SUPREMELY более читабельным и позволят очень легко вставить данные в ваше сообщение.

В качестве ПРОСТОГО примера ...

Dim msg = <html><body>  
                         Message sent at <%= Now.ToString() %>  
                 </body></html>

myMailMessage.IsBodyHtml = True
myMailMessage.Body = msg.ToString()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...