Krisztián's profileBátyai Krisztián[KRis]PhotosBlogListsMore Tools Help

Bátyai Krisztián[KRis]

Ha tudod, hogy egyenesen állsz, ne törődj vele, hogy ferde az árnyékod! vagyis Ha úgy érzed minden az iránításod alatt van, nem mész elég gyorsan!!! Avagy néhány gondolat a következőkről : C# 3.0 WPF WF LINQ Silverlight

Krisztián Bátyai

Occupation
Location
Interests
MCP  
Photo 1 of 1
October 22

MEF, avagy készítsünk kiterjeszthető alkalmazásokat 0.

Előbb vagy útóbb minden fejlesztő szembesül azzal a problémával, hogy olyan alkalmazást kellene írni, amely tulajdonképpen egy keretrendszer bizonyos alapfunkciókkal, amihez idővel újabb és újabb modulok kerülnek majd illesztésre.

Ha ez egy zárt projekt, és mi vagyunk a fejlesztői a keretnek és a moduloknak is, akkor nem is biztos hogy “keretrendszert” építünk általános megoldásokkal, hanem egyszerűen add new project, add refenrece, aztán ‘jónapot, had ‘szóljon, hivatkozunk az új dolgokra, rebuild, már mehet is az új exe+dll valahogy a usereknek.

Ez a megoldás gyors, egyszerű, ellenben ha sokan dolgozunk a projekten pl. *nd*aiakkal :D, és nem kellőképen dokumentált a fejlesztés módja, akkor egy nagy káosz kialakulásának leszünk jobb esetben csak szemtanui, rosszabb esetben résztvevői.
Továbbá ez e megoldás kivitelezhetetlen, ha ténylegesen egy szuper-világmegváltó-hiperfrankó-keretrendszert alkottunk, pl. egy grafikai eszközt, egy hitel/pénzügyitermék-prortfóliót kezelő rendszert. És azt akarjuk hogy bárki a világon fejleszthessen hozzá (bizonyos feltételekkel) modulokat: egy új effectet, egy új terméket/jutalékszámító eszközt,stb.
Ilyen esetben nem megoldás az hogy megkérjük a ‘világot hogy küldje már el a forráskódot, mi meg belefordítjuk… mert A usernek M modul, B usernek meg N modul kell, stb…

Mit lehet tenni?

Alkutunk egy saját leíró nyelvet: XML-ben össze lehet tenni a felületet, algoritmust, szabályokat, stb. Publikáljuk a “leírónyelvünk” specifikációját, és a modul futtatása nem más XML parszolás (saját parszerrel), majd futtatás…
Egyszerű dolgoknál működik, sőt néha ez a “tökéletes” megoldás (pl workflow rule engine), de ugye látjuk a korlátait, nehézségeit?

Nem marad más hátra, minthogy dll-t gyártatunk az önjelölt modulfejlesztőkkel, amit _nem_ teszünk be a keretalkalmazásba, és ezt a modult valahogy elérjük futási időben.
Nos, ez ugye a Reflection .Net-ben.

Milyen lehetőségeink vannak Reflection-el?

  • Nem adunk meg semmilyen kötöttséget, kivéve, hogy meghatározzuk 1<= “kulcs-pontot”. Ez lehet egy belépési pont, egy osztály, egy “programkód”,stb
    Pl. a keretalkalmazásunk nem tud mást mint, hogy az adott DLL-ben megkeresi az EztInditsdEl nevű (Form-ból származott) osztályt, példányosít egyet, és meghivja rajta a Show-t:
  • Assembly a = Assembly.LoadFile(dll_path);
              Type t = null;
              foreach (Type item in a.GetTypes())
              {
                  if (item.Name == "EztInditsdEl")
                  {
                      t = item;
                      break;
                  }
              }
    
              if (t!= null && t.BaseType == typeof(Form))
              {
                  ConstructorInfo ci= t.GetConstructor(new Type[0]);
                  object o= ci.Invoke(null);
                  Form f = o as Form;
                  f.MdiParent = this;                
                  f.Show();
              }
              else
              {
                  throw new Exception("hiba a modulban");   
              }

    Persze ezt lehet fokozni, konkrét osztálynevekkel, interfészekkel, attributumokkal, stb.
    Látszik, hogy nehézkes a használata: rengeteg reflection (minden egyes meghíváshoz, példányosításhoz, propertyhez,stb). ami ráadásul “lassú” is a late-binding miatt.
    Macera, megint.

  • A jól definiált “korlátokat”, kötelezettségeket határozunk meg, amiket be kell tartania a modul fejlesztőjének.
    Ezek tipikusan  baseclass-ok, interfészek, attribútumok, virtuális metódusok, stb…
    Ezeket betesszük egy külön DLL-be, mi adunk referenciát a DLL-re, és használjuk. A fenti megoldással szemben hatalmas az előnyünk. Reflection-t (szerencsés esetben) csak “egyszer” kell használnunk: a modul assembly betöltése után a “belépési” pont megkeresésésre és példányosítására.
    Utána már használhatjuk pl. a mi kis interfészünket.
    A modul fejlesztőjének nincs más dolga, mint az interfész megvalósítása (miután letöltötte az áltaunk publikussá tett DLL-t)

    Interfész:

    namespace ModulBase
    {
        public interface IModul
        {
            void Kiir(string mitirki);
    
            string Beolvas(string kerdes);
        }
    }
    Modul:
    namespace Modul1
    {
        public class MyModul:ModulBase.IModul
        {
            #region IModul Members
    
            public void Kiir(string mitirki)
            {
                Console.WriteLine(mitirki);
            }
    
            public string Beolvas(string kerdes)
            {
                Console.Write(kerdes);
                return Console.ReadLine();
            }
    
            #endregion
        }
    }
    
    Alkalmazás:
  • Assembly a = Assembly.LoadFile(dll_path);
    ModulBase.IModul modul =null;
    foreach (Type item in a.GetTypes())
    {
       
        if ((item.GetInterface(typeof(ModulBase.IModul).FullName)) != null)
        {
            object o= item.GetConstructor(new Type[0]).Invoke(null);
            modul = o as ModulBase.IModul;
            break;
        }
    }
    
    if (modul != null)
    {
        modul.Kiir("alma");
        string valasz = modul.Beolvas("barack");
        Console.WriteLine(valasz);
    }
    else
    {
        throw new Exception("hiba a modulban");
    }

    Mint látható itt Reflection-t csak a példányosításra használjuk, utána már az interfészünkön keresztül programozzuk a modult.
    Halleluja. Mindkét fél élete egyszerű.
    De…

(persze lehetne még fokozni, rengeteg egyéb ügyesebb-okosabb, de rosszabb megoldás is van…)

Rengeteg olyan általános probléma van ami minden moduláris alkalmazásnál előjön. Tipikus generikus problémák amikre tipikus generikus válasz adható… Minek feltalálnunk újra a spanyolviaszt?!?!
És mi van ha még a fenti intefész-DLL-t sem akarom odaadni, akarja használni a modul fejlesztője?!?!

Ekkor jön be a MEF-Managed Extensibility Framework, amely választ ad ezen generikus problémákra, ill. előbb-útobb a .Net része lesz, vagyis elfogadottá válik, így máris megvan a “szerződés” a keret- ill. a modul-alkalmazás fejlesztője között…

A témával egyelőre még nem foglalkoztam sokat, de amit láttam eddig az felkeltette az érdeklődésemet, így útjára indítok egy sorozatot, ami sorra veszi szépen a MEF-es fejlesztés mérföldköveit…

October 20

DragDrop Silverlight 3-ban

Végre!
Megérkezett a Drag&Drop támogatás a Silverlight 3-ban! Egészen pontosan a Silverlight Toolkit-ben!

Bár még nem generikus a megoldás, de reméljük az lesz. Egyelőre a következők támogatják az adott vezérlőben a drag&drop-t:

  • ListBoxDragDropTarget
  • TreeViewDragDropTarget
  • DataGridDragDropTarget
  • DataPointSeriesDragDropTarget

Használatuk ‘rémegyszerű:

  1. Silverlight Toolkit October telepítése
  2. Referenciát adunk a megfelelő silverlight és toolkit dll-ekre:
    c:\Program Files\Microsoft SDKs\Silverlight\v3.0\Libraries\Client\System.Windows.Controls.dll
    c:\Program Files\Microsoft SDKs\Silverlight\v3.0\Libraries\Client\System.Windows.Controls.Data.dll
    c:\Program Files\Microsoft SDKs\Silverlight\v3.0\Libraries\Client\System.Windows.Controls.Data.Input.dll
    C:\Program Files\Microsoft SDKs\Silverlight\v3.0\Toolkit\Oct09\Bin\System.Windows.Controls.Toolkit.dll
    C:\Program Files\Microsoft SDKs\Silverlight\v3.0\Toolkit\Oct09\Bin\System.Windows.Controls.Data.Toolkit.dll
    c:\Program Files\Microsoft SDKs\Silverlight\v3.0\Libraries\Client\System.Windows.Data.dll
  3. Aztán kellenek ugye a névterek is:
  4. xmlns:mswindows="clr-namespace:Microsoft.Windows;assembly=System.Windows.Controls.Toolkit"
    xmlns:datatoolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Toolkit"                             
    xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"

  5. Ezek után használjuk a megfelelő DragDropTarget-et:
    toolkit:ListBoxDragDropTarget
    datatoolkit:DataGridDragDropTarget
    ….
  6. Ha egy elemet, pl. egy ListBox-t körbefogtunk egy ilyen elemmel, akkor máris tudunk belőle kiráncigálni elemet,elemeket:
    (az ItemsPanelTemplate felüldefiniálása, nem feltétlen szükséges, ez amiatt kell, hogy alapból virtualizált panel szerepel benne…)
  7. <toolkit:ListBoxDragDropTarget Name="lb1" >
             <ListBox Name="lb1">
                 <ListBox.ItemsPanel>
                     <ItemsPanelTemplate>
                         <StackPanel Orientation="Vertical" />
                     </ItemsPanelTemplate>
                 </ListBox.ItemsPanel>
             </ListBox>
         </toolkit:ListBoxDragDropTarget>
  8. Ahhoz  hogy Drop-ot is fogadjon engedélyezni kell ezt:

    <toolkit:ListBoxDragDropTarget mswindows:DragDrop.AllowDrop="True">
  9. És már csak egy megfelelő adatforrásra van szükségünk:

    var lst1 = new ObservableCollection<int>();
              lst1.Add(1);
              lst1.Add(2);
              lst1.Add(3);
              lb1.ItemsSource = lst1;
  10. Szokásos eseményekre természetesen mi magunk is reagálhatunk “kézzel”:
    DragEnter
    DragLeave
    DragOver
    Drop
    ItemDragStarting
    ItemDroppedOnSource
    ItemDroppedOnTarget

    Vagyis tudunk mindenféle jópofa UX dolgot csinálni, ill az ItemDragStarting el tudunk indítani egy elemet, ill a Drop-pal és a ItemDroppedOnSource/ItemDroppedOnTarget-el pedig reagálni tudunk mind a cél mind a forrás vezérlőn…

Ha ezzel megvagyunk, akkor tökéletesen tudunk ide oda rángatni pl. ListBox-ból ListBoxba.

dd

A teljes kód (letöltés):

<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  x:Class="sl3_drag_drop_demo.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"             
 
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             
    xmlns:mswindows="clr-namespace:Microsoft.Windows;assembly=System.Windows.Controls.Toolkit"
    xmlns:datatoolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Toolkit"                              
             
    xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"
             
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
    <Grid x:Name="LayoutRoot">        
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <toolkit:ListBoxDragDropTarget Grid.Column="0"  mswindows:DragDrop.AllowDrop="True">
            <ListBox Name="lb1"   Background="LightBlue" MinWidth="50" MinHeight="150">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Vertical" />
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
            </ListBox>
        </toolkit:ListBoxDragDropTarget>
        <toolkit:ListBoxDragDropTarget Grid.Column="1" Drop="ListBoxDragDropTarget_Drop"  mswindows:DragDrop.AllowDrop="True">
            <ListBox Name="lb2" Background="LightYellow" MinWidth="50" MinHeight="150">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Vertical" />
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
            </ListBox>
        </toolkit:ListBoxDragDropTarget>
        <datatoolkit:DataGridDragDropTarget  mswindows:DragDrop.AllowDrop="True" Grid.Row="1" Grid.Column="0" >
        <data:DataGrid Name="grd1" ></data:DataGrid>
            </datatoolkit:DataGridDragDropTarget>
        <datatoolkit:DataGridDragDropTarget  mswindows:DragDrop.AllowDrop="True" Grid.Row="1" Grid.Column="1" >
            <data:DataGrid Name="grd2"></data:DataGrid>
        </datatoolkit:DataGridDragDropTarget>
    </Grid>
</UserControl>

http://timheuer.com/blog/archive/2009/10/19/silverlight-toolkit-adds-drag-drop-support.aspx

June 19

.Net 2.0-3.5 AKCIÓS képzések @ NetAcademia

Sziasztok!

Engedjétek meg, hogy közzétegyek egy kis reklámot.

Aki (vagy a cég ahol dolgozik) esetleg mostanában tervezett .Net képzést, annak figyelmébe ajánlom a következő tanfolyamokat:
(A szokásosnál jóval kedvezőbb áron… pláne ha lapul a cég fiókjában egy két Vócser)

A fejlesztői tanfolyam kódja

Akciós dátum:

Hossz:

A C# 3.0 . NET Framework programozási nyelv (50150)

2009.06.29.

5 nap

Microsoft .NET 2.0 fejlesztési alapismeretek (2956/2957)

2009.07.06.

5 nap

Webalkalmazás fejlesztése .NET Framework 2.0 - 3.5-ben (2543/2544/2310)

2009.07.20.

5 nap

Visual Studio ADO.NET 3.5 (6464)

2009.07.27.

3 nap

     

A C# 3.0 . NET Framework programozási nyelv (50150)

2009.08.03.

5 nap

Adatelérés fejlesztése Visual Studio 2005-ben (2541/2542)

2009.08.24.

5 nap

Webalkalmazás fejlesztése .NET Framework 2.0 - 3.5-ben (2543/2544/2310)

2009.08.31.

5 nap

     

Windows Presentation Foundation (6460)

2009.09.07.

3 nap

Microsoft Windows Communication Foundation (6461)

2009.09.14.

3 nap

 

A fenti táblázatban szereplő tanfolyamok ára a tanfolyam hosszától és a megrendelés leadásának időpontjától függ:

A megrendelés időpontja:

A képzés fapados ára 5 napos oktatás esetén:

Június 30-ig

159.000 Ft + ÁFA

A megrendelés időpontja:

A képzés fapados ára 4 napos oktatás esetén:

Június 30-ig

149.000 Ft + ÁFA

A megrendelés időpontja:

A képzés fapados ára 3 napos oktatás esetén:

Június 30-ig

139.000 Ft + ÁFA

Július 1. után a „fapados” jelentkezési lehetőség véget ér, a tanfolyamokra ezt követően az adott tanfolyam listaárán lehet regisztrálni. SA vouchert elfogadunk!

Bővebb információ: www.netacademia.net/nyariakcio

April 17

MVP

Egy kicsit csendben voltam blog ill. cikk írás dologban az elmúlt hónapokban.MVP_Horizontal_BlueOnly
(remélem ez most újra megváltozik majd)

Szerencsére
ennek az volt az oka, hogy eléggé elfoglalt voltam munka ügyben. Számos rendezvény volt ahol részt vettem és ‘jópár tanfolyamot tartottam mindeközben. (és tartok folyamatosan)

Az elmúlt egy-másfél én munkája, köztük a fenti rendezvények, alapján a Microsoft érdemesnek tartott arra hogy tagja legyek a magyarországi MVP csapatnak.
Április elsején :))) MVP címmel jutalmazott, Client App Dev “témakörben”.

Hogy mi is az az MVP cím?!?
Azt hiszem ezt sokkal jobban leírták már nálam:

A program keretében ezentúl számos dologhoz hozzáférhetek a publikussá válása előtt (persze mindenféle NDA mellett), könnyen kapcsolatot teremthetek mindenféle Product Grouppal az Olimposzon ( Seattle-Redmond-Microsoft HQ), talán még el is juthatok oda jövőre, és még sok minden egyéb…

Remélem, hogy így még hasznosabban tudok majd részt venni a hazai .Net életben

 

És a lényeg :
(nem udvariasságból, hanem őszintén, tényleg!!!)

Köszi mindenkinek : NetAcademia, Microsoft-os “kollégák”
nélkületek nem jöhetett volna ez létre :)))

Rendezvény, meghívó, Azure, Silverlight, Sync Services

 

Egy Május 4.-én Szegeden megrendezésre kerülő eseményre szeretném felhívni a figyelmet, ahol lesz szerencsém előadni egy témában.

Akit érdekelnek a következő témák, és Szeged közelében lakik az jöjjön el:

  • AZURE, cloud computing
  • Silverlight 3, RIA
  • Sync services

Az előadásokat Bátorfi Zsolt barátom fogja felvezetni a szokásos :) ‘mivel fogunk találkozni a következő hónapokban, évben a platformon és körülötte témával.
Ezek után 3 MVP tart 3 előadást Silverlight, RIA és Sync Services témakörben.

Helyszín és időpont:
2009. május 4. 9.00 – 15.00, Ipari Kamara, Szeged

További részletek, jelentkezés : http://devportal.hu/content/usergroupszeged.aspx

 

Feed

The owner hasn't specified a feed for this module yet.
Köszönjük a látogatást!
Please wait...
Sorry, the comment you entered is too long. Please shorten it.
You didn't enter anything. Please try again.
Sorry, we can't add your comment right now. Please try again later.
To add a comment, you need permission from your parent. Ask for permission
Your parent has turned off comments.
Sorry, we can't delete your comment right now. Please try again later.
You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
Complete the security check below to finish leaving your comment.
The characters you type in the security check must match the characters in the picture or audio.