2012-12-18 11 views
5

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

+2

Można by utworzyć sekcję niestandardową config, jak wskazano w http://stackoverflow.com/questions/758986/custom-app-config-config-section-handler – stuartd

+0

@StuartDunkeld bardzo ładny, dokładnie coś takiego tego szukałem, mimo że wydaje się trochę przesadzone dla tego (zuchwale) prostego problemu. –

+0

@ 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. –

Odpowiedz

3

Powinieneś napisać część konfiguracji cusom dla swoich odbiorców, a następnie dołączyć tę sekcję. W sekcji niestandardowej będziesz mógł również przechowywać konfigurację odbiorników poza głównym plikiem konfiguracyjnym i wprowadzać ją za pomocą atrybutu configSource.

Na początek można sprawdzić tutaj: http://haacked.com/archive/2007/03/11/custom-configuration-sections-in-3-easy-steps.aspx

w krótkich słowach należy:

  1. Wdrożenie sekcji niestandardowej config przez dziedziczenie z ConfigurationElement (dla jednego elementu) i ConfigurationElementCollection (w przypadku kolekcji potrzebujesz kolekcji w twoim przypadku, a każdy odbiorca będzie elementem połączenia). Przykładowa realizacja jest odpowiedź tutaj: how to have custom attribute in ConfigurationElementCollection?

  2. Definiowanie sekcji config w głównej config

  3. Dodaj swoją niestandardową konfigurację i może być uwzględniony jako plik osobny config

+0

Dwa dodatkowe linki prowadzące: http://msdn.microsoft.com/en-us/library/2tw134k3.aspx lub tutaj z configSource http://joelabrahamsson.com/entry/creating-a -custom-konfiguracja-sekcja-w-sieci – Regfor

+0

Już obejrzałem artykuł 3-easy-steps, nie bardzo pomoc, potrzebuję kolekcji elementów (wielu odbiorców), artykuł enly zajmuje się 1 na raz. Ten ostatni link z joel abrahamsson jest bardzo interesujący, ale –

+0

Nie, to tylko na początek, aby zrozumieć pomysł niestandardowych sekcji konfiguracji. Czy sprawdziłeś krok 2 link http://stackoverflow.com/questions/8829414/how-to-have-custom-attribute-in-configurationelementcollection? – Regfor

1

Utwórz sekcję niestandardową dla pliku web.config. Możesz znaleźć kilka przykładów, jak to zrobić tutaj http://haacked.com/archive/2007/03/11/custom-configuration-sections-in-3-easy-steps.aspx lub możesz trochę google.

Niż można odwzorować obiekty z sekcji do pewnego rodzaju, jeśli POCO, które utworzysz do reprezentowania odbiorcy wiadomości e-mail.

Musisz więc operować kolekcją odbiorników e-mail, które ułatwią Ci pracę.

I nie zapomnij utworzyć warstwy usługi do wysyłania wiadomości e-mail.

Więc tutaj kroki trzeba zrobić:

  1. utworzyć sekcję niestandardową config.
  2. Tworzenie reprezentacji Poco odbiornika email
  3. mapie podmioty z niestandardowych config do poco kolekcji
  4. Tworzenie usługi lub prosty pomocnika do wysyłania e-maili

BTW jest to dobra praktyka, aby oddzielić logikę specyficzną dla domeny/aplikacji w celu oddzielenia plików, więc przyjrzyj się także temu linkowi. Moving a custom configuration group to a separate file

Powodzenia!

+0

Nie ASP, ale myślę, że to nieistotne. Jednak przyjrzałem się rozwiązaniu 3-łatwych kroków, a niestandardowy element konfiguracji w tym przykładzie jest unikalny, tj. tylko 1 element BlogSettings. Muszę przechowywać kolekcję elementów –

0

Można zapisać wartości Nazwa/Adres w sekcji na adres e-mail.

<configuration> 
    <configSections> 
    <section 
     name="MailAddressing" 
     type="System.Configuration.NameValueFileSectionHandler,System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </configSections> 

    <MailAddressing> 
    <add key="To" value="&quot;An Example&quot; <[email protected]>;&quot;Second Example&quot; <[email protected]>" /> 
    <add key="CC" value="[email protected]" /> 
    <add key="BCC" value="[email protected]" /> 
    <add key="From" value="[email protected]" /> 
    </MailAddressing> 
</configuration> 

Następnie otworzyć podczas wizyty w (y) przez

NameValueCollection section = 
     (NameValueCollection)ConfigurationManager.GetSection("MailAddressing"); 

Być może najprostszym rozwiązaniem dla serializacji jest użycie konwerterów ciągów w klasie MailAddress obsłużyć wartości ustawień.

// Test data 
var addressList = new[] 
    { 
     new MailAddress("[email protected]", "An Example"), 
     new MailAddress("[email protected]", "Second Example") 
    }; 

// To String for saving in config 
string strValue = addressList.Select(i => i.ToString()) 
      .Aggregate((i, j) => i + ';' + j); 

// From String for reading from config 
MailAddress[] addressList2 = strValue.Split(';').Select(i => 
      new MailAddress(i)).ToArray(); 

Teraz możesz mieć jedno ustawienie konfiguracyjne na wartość To/CC/BCC pogrupowane według adresów e-mail. Będzie działać z jednym lub wieloma adresami, z lub bez nazwy wyświetlanej.

+0

Tak, próbowałem bawić się z typem NameValueCollection, jak w twoim przykładzie, ale nadal mam do czynienia z ograniczeniem klucz/wartość i mam wiele właściwości dla każdego wpisu (nazwa, adres, do/cc). –

+0

Myślę, że ci się spodoba Dodałem wtedy :) – ccook

0

Chociaż zgadzam się, że sekcja konfiguracji niestandardowej jest prawidłowym podejściem, możliwe jest umieszczenie wielu adresów, w tym nazw wyświetlanych w pojedynczej aplikacji. Na przykład.:

<add key="To" 
    value='"Recipient Name" &lt;[email protected]>, "Another Recipient Name" &lt;[email protected]>'/> 

... 
string to = ConfigurationManager.AppSettings["To"]; 
MailMessage m = new MailMessage(); 
m.To.Add(to); 
Powiązane problemy