Mam prostą aplikację, która wysyła wiadomości e-mail z informacjami o statusie niektórym z naszych wewnętrznych użytkowników.. Konfiguracja aplikacji .NET do przechowywania informacji kontaktowych e-mail.
Używam prostego pliku konfiguracyjnego aplikacji (App.config) do przechowywania adresu e-mail i nazwy, o zamierzonych użytkownikach. Ponieważ sekcja appSettings wydaje się tylko do obsługi prostych par klucz/wartość, to obecnie wygląda następująco:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="toName" value="Recipient Name" />
<add key="toAddr" value="[email protected]" />
<add key="toName2" value="Another Recipient Name" />
<add key="toAddr2" value="[email protected]" />
<add key="ccName" value="An Archive"/>
<add key="ccAddr" value="[email protected]"/>
<add key="ccName2" value="Another Archive"/>
<add key="ccAddr2" value="[email protected]"/>
</appSettings>
</configuration>
A potem dodaję każdego odbiorcy indywidualnie w kodzie.
Obecnie oznacza to, że za każdym razem, dodać lub usunąć odbiorców, ja też trzeba przepisać kod do obsługi nowych odbiorców i odbudować i ponownie wdrożyć aplikację
Chciałbym być w stanie przechowywać zwyczaj wpisy konfiguracyjne, jak to może:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<recipients>
<recipient recType="to" recAddr="[email protected]" recName="Recipient Name" />
<recipient recType="to" recAddr="[email protected]" recName="Another Recipient Name" />
<recipient recType="cc" recAddr="[email protected]" recName="An Archive"/>
<recipient recType="cc" recAddr="[email protected]" recName="Another Archive"/>
</recipients>
</configuration>
Więc mogę pętli nich:
MailMessage message = new MailMessage();
foreach(recipient rec in recipients)
{
MailAddress mailAddress = new MailAddress(recipient["recAddr"],recipient["recName"]);
if(recipient["recType"] == "cc")
message.CC.Add(mailAddress);
else
message.To.Add(mailAddress);
}
Jak tego dokonać?
odpowiedział: Korzystanie przykład w linku Regfor jest, byłem w stanie zbudować sekcji konfiguracji niestandardowej z kolekcją niestandardowych ConfigurationElements wygląda tak:
public class RecipientElement : ConfigurationElement
{
[ConfigurationProperty("name", IsRequired = true, IsKey = true)]
public string Name
{
get
{
return (string)base["name"];
}
}
[ConfigurationProperty("mailAddr", IsRequired = true)]
public string Address
{
get
{
return (string)base["mailAddr"];
}
}
[ConfigurationProperty("isCC")]
public bool IsCC
{
get
{
return (bool)base["isCC"];
}
}
}
z końcowej części config:
<recipientSection>
<recipients>
<recipient name="Primary recipient" mailAddr="[email protected]" isCC="false" />
<recipient name="Archive" mailAddr="[email protected]" isCC="true" />
</recipients>
</recipientSection>
Zapętlenie kolekcji recipients
pozwala mi dodać tylu odbiorców, ilu SmtpClient pozwoli mi wysłać :)
Dzięki chłopaki
Można by utworzyć sekcję niestandardową config, jak wskazano w http://stackoverflow.com/questions/758986/custom-app-config-config-section-handler – stuartd
@StuartDunkeld bardzo ładny, dokładnie coś takiego tego szukałem, mimo że wydaje się trochę przesadzone dla tego (zuchwale) prostego problemu. –
@ MathiasR.Jessen wydaje się być przesadzone, ponieważ używasz pliku konfiguracyjnego dla czegoś, co nie zostało zaprojektowane do zrobienia. Czas spędzony na próbach włamania się do pliku konfiguracyjnego może zostać poświęcony na stworzenie własnego prostego pliku XML, zaprojektowanego dokładnie tak, jak chcesz. –