web 2.0

Lessons Learned: configuratie aanpassen aan deployment

UPDATE: Er is een mooie extensie voor die het ng allemaal veel makkelijker maakt de Slow Cheetah

Binnen Visual Studio had ik de bestanden web.debug.config en web.release.config al eens zien staan maar er nooit echt wat mee gedaan. Dat was ook niet eerder nodig aangezien de deployment altijd door andere partijen werd gedaan. Dit maal moest ik echter zelf de web.config files opleveren en ben ik mij gaan verdiepen in het aanpassen van de config files op basis van de omgeving waar naar toe gepubliceerd zal worden. 

De basis blijft de "normale" web.config file en eigenlijk ga je vervolgens de afwijkingen per omgeving in de betreffende files vastleggen. Beste voorbeeld, de connectionstring naar de database. 

Standaard web.config

 

<connectionStrings>
    <add name="ApplicationServices" connectionString="Data Source=localhost;
       Initial Catalog=DatabaseNaam;User Id=User;Password=Password" />
  </connectionStrings>
 

 

Voor de release omgeving (web.release.config)

 

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<connectionStrings>     <add name="ApplicationServices" connectionString="Data Source=NIEUWE_SERVER;
    Initial Catalog=DatabaseNaam;User Id=User;Password=Password" xdt:Transform="SetAttributes" xdt:Locator="Match(name)/>
</connectionStrings>
 

 

De namespace  xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" wordt toegevoegd zodat de verschillende commando's gebruikt/herkend kunnen worden. De belangrijkste hiervan zijn:

  • Locator="Match(name)" deze wordt gebruikt om te herkennen welk element aangepast moet worden indien er meerdere elementen van hetzelfde type zijn. Het attribuut wat gebruikt moet worden voor de identificatie staat bij de match, in dit geval het attribute name. 
  • Transform dit commando zorgt voor de daadwerkelijke transformatie en heeft een aantal mogelijke waardes
    • SetAttributes voor het zetten van de attributen gespecificeerd in de web.release.config naar de nieuwe web.config
    • Remove voor het verwijderen van het element
    • RemoveAttributes(attribuut naam) voor het verwijderen van bepaalde attributen bijvoorbeeld het debug attribuut op de compilation
    • Insert voor het toevoegen van een element
    • Voor de overige commando's zie de Microsoft link

 

 

Niet alle configuratie items staan altijd in de web.config, soms staan deze ook in andere config bestanden zoals bijvoorbeeld de configuratie van de logging middels log4net. Deze heeft een eigen configuatie maar die wil ik ook wel aan kunnen passen middels deze techniek. Hiervoor moet een stukje code aan de csproj file toegevoegd worden om dit mogelijk te maken. 

 

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
    <Target Name="AfterCompile" Condition="exists('log4net.$(Configuration).config')">
      <TransformXml Source="log4net.config"
        Destination="$(IntermediateOutputPath)$(TargetFileName).config"
        Transform="log4net.$(Configuration).config" />
      <ItemGroup>
        <AppConfigWithTargetPath Remove="log4net.config"/>
        <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
          <TargetPath>$(TargetFileName).config</TargetPath>
        </AppConfigWithTargetPath>
      </ItemGroup>
    </Target>
 

 

Nu worden beide config files aangepast aan de configuratie die ik kies. Standaard zijn de debug en release, maar er kunnen er natuurlijk nog veel meer toegevoegd worden. Nu hoef ik mijn configuratie alleen nog maar op de juiste omgeving te zetten en publish te kiezen voor het web project en mijn config zal juist gegenereerd worden en eventuele nieuwe keys die ik toegevoegd had in mijn eigen config worden automatisch meegenomen. 

 

Meer informatie:

 

ASP.net mailen testen zonder SMTP

Een collega kwam met deze tip voor het testen van mail functionaliteit vanuit een .Net applicatie zonder dat je beschikking hebt tot een SMTP server of dat je gewoon niet wilt dat de mailtjes verstuurd worden.

De mailtjes worden dan opgeslagen in een folder waar IIS wel lees en schrijfrechten moet hebben.

Hieronder de volledige uitleg.

http://www.devcurry.com/2011/03/test-emails-in-aspnet-without-mail.html

Alleen overeenkomstige items selecteren met LINQ

Aangezien ik op het internet (nog) geen goed voorbeeld kon vinden hoe ik onderstaande situatie op kon lossen met LINQ heb ik er zelf maar even een stukje over geschreven wie weet help ik er iemand anders nog mee. 

De situatie is als volgt, ik heb een verzameling items en daaruit wil ik een lijst met bepaalde eigenschappen hebben. Echter dit is na filtering op meerdere waarden van een andere eigenschap en dan wil ik alleen de waardes hebben waarvoor beide filters gelden.

Voorbeeld:

 

* +=======================================+
* +SEGMENT + Periode begin + Periode eind +
* +=======================================+
* + A      + 1-1-2007      + 31-12-2007   + 
* + A      + 1-1-2008      + 31-12-2008   + 
* + A      + 1-1-2009      + 31-12-2008   +
* + B      + 1-1-2008      + 31-12-2008   +
* + B      + 1-1-2009      + 31-12-2009   +
* + B      + 1-1-2010      + 31-12-2010   +
* + C      + 1-1-2008      + 31-12-2008   +
* + C      + 1-1-2009      + 31-12-2009   +
* +=======================================+

Als nu A geselecteerd is, is het resultaat 1-1-2007, 1-1-2008 en 1-1-2009
Als nu B geselecteerd is, is het resultaat 1-1-2008, 1-1-2009 en 1-1-2010
Maar als nu A en B geselecteerd zijn is het resultaat 1-1-2008 en 1-1-2009

In LINQ kan dit nu als volgt
var selection = (from i in items
    group i.Segment by new {i.PeriodeBegin, i.PeriodeEind}
       into igroup 
       where igroup.Distinct().Count() ==
             (from s in items select s.Segment).Distinct().Count()
    select new {
                      igroup .Key.sPeriodeBegin,
                      igroup .Key.PeriodeEind
                    }
      ).Distinct().ToList();

 

 

Wie weet is er iemand anders nog mee geholpen