Staňte se programátorem: Aplikace s podporou doplňků

Dnes si napíšeme jednoduchý poštovní program, na kterém si ukážeme, jak lze program rozšiřovat o libovolné doplňky – pluginy. Zatím jen experimentální, příště ale už zcela funkční.

V dnešním díle si napíšeme velmi jednoduchý klient s podporou doplňků. Program bude umět odesílání e-mailových zpráv, k čemuž nám pomohou třídy uložené ve jmenném prostoru System.Net.Mail. Pro čtení e-mailových zpráv přes protokol POP3 však v .NETu třídy neexistují, a proto si je budeme muset napsat v sami. Funkce čtení zpráv bude přidána k našemu programu jako plugin a vytváření rozšíření bude hlavní náplní dnešního článku.

Nejprve si ukážeme, jak vlastně takový doplněk funguje, funkce pro příjem pošty pomocí POP3 protokolu bude obsahem některého z dalších dílů. Na základě dnešního článku tedy budete moci aplikaci libovolně rozšiřovat o nové funkce pomocí knihoven.

Odesílání e-mailový zpráv

Pro odeslání e-mailové zprávy musíme nejprve vytvořit instanci třídy MailMessage ze jmenného prostoru System.Net.Mail, do jejíhož konstruktoru zadáme adresu odesilatele, příjemce, předmět a obsah zprávy. Pro přidání příloh použijeme metodu Attachments.Add třídy MailMessage. Tato metoda očekává jako argument instanci třídy Attachment představující konkrétní přílohu.

 mailer.png
Rozhraní jednoduchého pošťáka a možnost přidání přílohy

Zprávu odešleme pomocí metod Send/SendAsync třídy SmtpClient. Metodu Send použijeme v případě, že chceme, aby program čekal na odeslání e-mailové zprávy. Použijeme-li metodu SendAsync, odeslání zprávy bude zprostředkováno na novém pracovním vlákně, díky čemuž bude možné s aplikací dále volně pracovat.

MailMessage zprava = new MailMessage(“odesilatel@xyz.cz”,
                                     “prijemce@xyz.cz”, 
                                     “Předmět”, 
                                     “obsah”);

if (prilohy != null)
  for (int x = 0; x < prilohy.Length; x++)
    {
      zprava.Attachments.Add(new Attachment(prilohy[x]));
    }

SmtpClient s = new SmtpClient(“smtp server”);
s.SendAsync(zprava, null);

Klient je velmi jednoduchý, můžete jej ale rozšířit třeba o použití autentizovaného a zabezpečeného SMTP serveru a odesílat tak zprávy třebas pomocí Gmailu, Seznamu aj.

Vytváření pluginů

Pluginy (což jsou externí dynamické knihovny) slouží k tomu, aby dodávaly již hotové aplikaci nějakou novou funkcionalitu aniž by bylo potřeba mít přístup ke zdrojovým kódům aplikace a nějak do nich zasahovat. Aplikace, které podporují doplňky, jsou snadno rozšiřitelné, což je velká výhoda, protože tak umožňují ostatním programátorům snadno vylepšovat aplikaci.

mailer_addon.png
Pokud se náš experimentální doplněk načte ze složky Plugins,
vytvoří se nová záložka a prozatím jen vypíše krátká zpráva

Pěkným příkladem takto rozšiřitelné aplikace je Microsoft Visual Studio.Net, které samo o sobě neobsahuje prostředí pro žádný programovací jazyk, ale při instalaci si uživatel volí jaké rozšíření (programovací jazyky) chce instalovat. Krom toho je možné do Visual Studia nové vývojové nástroje doinstalovat i později.

Jiným typickým příkladem pluginů jsou obrázkové efekty v grafických editorech. Aby plugin fungoval, musí být jeho třídy, jež mají být v programu použity, odvozeny od rozhraní, které je znají obě strany – jak cílová aplikace, tak samotný plugin. To se řeší další knihovnou, která obsahuje daná rozhraní. V našem projetku se tato knihovna jmenuje Core a obsahuje jedno rozhraní IPlugBase.

public interface IPlugBase
{
  UserControl Ctrl {get;}
  string Title{get;}
}

Třída odvozená od tohoto rozhraní musí mít dvě vlastnosti Ctrl a Title. Vlasnost Ctrl vrací uživatelský prvek, který bude do aplikace přidán z pluginu přidán. V našem případě to jsou komponenty určené k přijímání e-mailových zpráv. Vlastnost Title zase vrací popis toho, co daný uživatelský prvek dělá. V tomto případě to je “Příjem zpráv”.

public class Plugin : IPlugBase
{
  UserControl1 usc;
  public Plugin()
 {
    UserControl1 usc = new UserControl1();
    this.usc = usc;
 }
  public UserControl Ctrl
  {
    get
    {
      return usc;
    }
  }
  public string Title
  {
    get
    {
      return "Příjem zpráv";
    }
  }
}

Pro vytvoření instancí tříd uložených v pluginu slouží metoda CreateInstance třídy System.Reflection.Assembly, která vytvořenou instanci vracízaboxovanou v datovém typu object, a proto je nutné ji přetypovat na rozhraní, ze kterého je odvozena – v našem případě to je rozhraní IPlugBase uložené v knihovně Core. Více napoví následující kód:

private void Form1_Load(object sender, EventArgs e)
{
  int i = 1; 
  // Jednotlivě prochází všechny dinamické knihovny ve složce Plugins
  foreach (string s in Directory.GetFiles(Application.StartupPath + @"\Plugins"))
  {
    // Načte DLL
    Assembly ass = Assembly.LoadFrom(s);
    Core.IPlugBase b = null;
    // Projde jednotlivé datové typy v Dll
    foreach (Type t in ass.GetTypes())
    {
      // Pokud se datový typ nazývá Plugin...
      if (t.Name == "Plugin")
      {
        // … je to ten, který je odvozen od rozhraní IPlugBase, a proto
        // lze z něho vytvořit instanci.
        b = (Core.IPlugBase)ass.CreateInstance(t.FullName);'
      }
    }
    // Použití instance
    this.tabControl1.TabPages.Add(b.Title);
    tabControl1.TabPages[i].Controls.Add(b.Ctrl);
    i++;
  }
}

Dnešní projekt se tedy skládá ze třech programů. Prvním je samotné rozhraní elektronického pošťáka, druhým je propojovací knihovna Core a třetím už samotný pagin pro příjem pošty POP3. Ten zatím nic neumí, pouze v aplikaci vytvoří novou záložku a vypíše do jejího panelu krátký text. To vše již řeší samotný doplněk, nikoliv pošťák. Obsahem POP3 knihovny tedy může být jakýkoliv kód, který pozmění funkce pošťáka podle toho, co mu dovolí propojovací knihovna Core.

Vzhledem ke specifičnosti dnešního projektu vám nabídneme pouze zdrojový kód pro Microsoft Visual C# 2008 Express Edition a vyšší.


Mareš, Amadeo: 1001 tipů a triků pro C#

c_kniha_mares.pngNestačí vám náš seriál? Pořiďte si knihu jeho autora, ve které vás seznámí s tisícovkou programovacích tipů a technik. Díky velkému počtu tipů, návodů, triků a rad kniha poslouží při každé příležitosti. Kdykoli si nevíte rady, stačí nalistovat příslušnou stranu a problém okamžitě vyřešit. Tipy a triky míří především na začínající programátory; užitečné rady tu ovšem najdou i pokročilejší vývojáři a ostřílení znalci. SOučástí publikace je i přiložené DVD, na kterém najdete bezplatné vývojové prostředí Visual C#, databázový server a především všechny zdrojové kódy z knihy, takže je budete moci okamžitě použít. Webové stránky knihy.

Diskuze (18) Další článek: Nová kniha: Illustrator CS4 Oficiální výukový kurz

Témata článku: , , , , , , , , , , , , , , , , , ,