Archive for the ‘.NetTiers’ Category

h1

Agenti v .NetTiers, pres WCF

April 3, 2008

Agenti jsou servicy, ktere periodicky spousteji nejaky kod. Napriklad prepocitavani priorit tasku, generovani tasku atd…
Dulezitym prvkem je to, ze kod, ktery agenti vykonavaji je lepsi drzet na strane orchestraci.
Proc?? 
Pokud budeme volat kod na strane agenta (client-side), musime resit serializace (napriklad serializaci CaseQuery, ktery posilame service).V agentovi volame servicy ktere jsou na strane serveru. Musime si uvedomit, ze neni mozne volat primo servicy z Aplikace, ktera bezi na localhostu. Tim myslim nevolat

IService service = new Services.Service()

Musime volat pekne pres WCF servicy, ktere jsou ne na localu, ale na strane aplikace:

IFutureActivityService futureActivityService = WcfClient.ProxyFactory.Orchestrations.FutureActivityProxyInstance();Potom ale nesmime zapomenout endpointy v App.configu.

Dale je vhodne zvazit, jestli uz operace nad DB nevolat primo v SQL procedurach. Opet si tim muzeme usetrit spousty prace. Udelat join pres vice jak dve tabulky je v .Nettiers preci jenom orisek. Pokud chceme volat spolecne s nasi metodou Workflow, pouziti trored procedur zase nemusi byt nejlepsi napad. Tim myslim, volat z SP workflow. furtn nam ale SP mohou velmi zjednodusit zivot. Dalsi vyhodou pro pouziti servis na strane aplikace je fakt, ze se to mnohonasobne lepe testuje. Jenom zavolate metodu servicy v unit testu. Nejakeho agenta neresite.  
 

  • Zkratka agent by se mel postarat pouze o spusteni metody v orchestraci a na nejakou dobu skoncit. Nic vic, nic min. Usetrime si tim mraky casu.
  • Vsechna logika musi byt na strane orchestraci, usetrime si ohromna kvanta prace!!
  • Vzdy zvazte pouziti Stored procedur, pokud agent dela hromadne operace nad DB.
      
h1

.NetTiers binding II No refresh of TexBox

March 14, 2008

Pokud nastavime databinding napr LookUpEditu:

lueFlightCompany.DataBindings.Add( new System.Windows.Forms.Binding( "EditValue", this.bsFlight, "CompanyFK", true));pak po jeho zmene a opusteni kontrolu se vola v bindovane entite .generated propertka[DataMember] 
[DescriptionAttribute(""), System.ComponentModel.Bindable( System.ComponentModel.BindableSupport.Yes)] 
[DataObjectField(false, false, false)] 
public virtual System.Int32 CompanyFK 
{ 
get{...} 
set{...} 
}

Po kazde zmene jakehokoliv controlu z  bindovaneho formulare se zavolá změněné propertky setter a všech ostatních propertek getter. Tím se docílí toho, že se bude form stále aktualizovat.
Problém nastává, když se nevolá setter nějaké z properties. Výsledkem je to, že se při každém refreshi (opuštění bind. controlu nabinduje hodnota, se kterou se formulář nabindoval na prvopočátku). Takže nám stále mizne třeba obsah textboxu, nebo se plní přednastavenou hodnotou a ne změněnou (volá se jen getter).
Proto musíme volání setteru trošičku explicitně dopomoct. Přidáme do definice bindingu parametr  

DataSourceUpdateMode.OnPropertyChanged.

Výsledek nastavení bindingu je tedy následující:

this.txtFlightNumber.DataBindings.Add( 
   new System.Windows.Forms.Binding( "EditValue", 
   this.bsFlight, "FlightNumber",  true,   
   DataSourceUpdateMode.OnPropertyChanged));    http://community.codesmithtools.com/forums/p/3158/13283.aspx
h1

.NetTiers Distinct

March 13, 2008

Once time, I need, how to make Distinct in the .nettiers. Best way, how to do it is stored procedure.
result on application level is here:

private static TList<CompanyClient> Distinct(TList<CompanyClient> list)
{
  bool b;
  TList<CompanyClient> outLits = new TList<CompanyClient>();
  foreach (CompanyClient client in list)
  {
       b =
false;
       foreach (CompanyClient lit in outLits)
      {
          if (client.CompanyFK == lit.CompanyFK)
         b =
true
      
}
     
if(!b)
      tLits.Add(client);
  }
  return outLits;
}

 

h1

DeepLoad / DeepSave 1:1 and 1:N

March 13, 2008

DeepLoad for 1:1 
public Flight GetByID(long id)
{
  Services.
FlightService service = new Services.FlightService();
  return service.DeepLoadByID(id,true,
     
DeepLoadType.IncludeChildren,
     
typeof(GeneralFlight),
      
typeof(SpecificFlight));
}

DeepLoad for 1:M
public Flight GetByID(long id)
{
  Services.
FlightService service = new Services.FlightService();
  return service.DeepLoadByID(id,true,
     
DeepLoadType.IncludeChildren,
     
typeof(TList<GeneralFlight>),
      
typeofSpecificFlight));
}


Deepsave operations are analogic ;)

h1

BindingSource & .NetTiers

March 13, 2008

Tak jsem dlouhou dobu řešil, proč tento kód neprocházel:

public void Bind(Flight flight) 
{ 
    if (!DesignMode) 
    {  
        this._flight = flight; 
        bsAirport.DataSource =  WcfClient.CodeTables.AirportCodeTable.Instance; 
        bsFlightType.DataSource = WcfClient.CodeTables.FlightTypeCodeTable.Instance; 
        bsFlightSpecification.DataSource = WcfClient.CodeTables.FlightSpecificationCodeTable.Instance; 
        bsFlight.DataSource = flight; 
   } 
}

konkrétně docházelo k tomu, že:

    bsFlight.DataSource = flight;

vůbec neplnil formulář daty. Kde je problém??

Flight je totiž .NetTiers Entita. Pokud na něm voláme operátor “=” , pak, automaticky vol8 metodu Clone(), kvůli bezpečnosti.  Pokud jsem zkopíroval flight do _flight  (a myslel jsem, že předávám jen referenci), tak došlo k vytvoření nové instance.  Tato nová instance ale nebyla přesnou kopií. Nevím proč, ale všechny hodnoty,  které  byly předány se nastavili na hodnotu NULL. Proto se formulář nebindoval.Řešení se ukázalo snadnější, než bylo:

public void Bind(Flight flight) 
{ 
    if (!DesignMode) 
    { 
        bsAirport.DataSource = WcfClient.CodeTables.AirportCodeTable .Instance; 
        bsFlightType.DataSource = WcfClient.CodeTables.FlightTypeCodeTable .Instance; 
        bsFlightSpecification.DataSource =  WcfClient.CodeTables.FlightSpecificationCodeTable .Instance; 
        bsFlight.DataSource = flight; 
   } 
}
Follow

Get every new post delivered to your Inbox.