Castle Windsor: container.Install(FromAssembly.This()) – Občas nefunguje? Pozor na inlining!

Dneska nás tu zabavil problém s chováním Castle Windsor.

Symptom

Na jednom z projektů Castle Windsor „občas“ ignoroval registrace a odmítal resolvovat komponenty, které měly být regulérně zaregistrovány pomocí installerů. Při vývoji a ladění z Visual Studia na vývojářských strojích vše fungovalo, po continous integration deploymentu na STAGE aplikace nejela. Padala na chybu:

System.ApplicationException: Error in resolving dependency XY. --->
 Castle.MicroKernel.ComponentNotFoundException: No component for supporting the service XY was found

Celé se to chovalo velmi nedeterministicky. Při re-deploymentu stejného buildu aplikace pomocí XCOPY se tato rozběhla, po iisreset zase nešla, atp.

Analysis

Vzhledem k tomu, že aplikace se chovala jinak na vývojářských strojích (fungovala v DEBUG i RELEASE) a jinak na STAGE, bylo potřeba zvolit trochu agresivnější metody ladění. Pokus o remote-debugging vypadal zdlouhavě, analýza memory dumpu ukázala, že ve WindsorContaineru příslušné registrace opravdu chybí.

Zkoumání registrací/installerů nakonec ukázalo, kde je problém.

Cause

Uspořádání solution bylo jednoduché. Webová aplikace, v Global.asax:Application_Start se vytvoří container a následně se na něm zavolá extension-metoda ConfigureForWebApplication(), která samotná je však v samostatné class-library WindsorInstallers, kde jsou umístěné všechny installery a extension-metoda si je volá přes Install(FromAssembly.This()):

public static void ConfigureForWebApplication(this IWindsorContainer container)
{
	container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel));
	container.AddFacility();
	container.Install(FromAssembly.This());
}

Kritickým a zároveň podezření-hodným místem je právě řádek s installem. Rychlý náhled do zdrojáků FromAssembly.This() a konzultace s MSDN ohledně Assembly.GetCallingAssembly potvrzuje podezření na inlining a zmatečné určení assembly s installery. Metoda ConfigureForWebApplication() byla inlinována a GetCallingAssembly() tak vracelo jako assembly tu, v které je Global.asax:Application_Start().

Action

Náprava je naštěstí jednoduchá, metodu ConfigureForWebApplication() je potřeba označit atributem MethodIml pro compiler tak, aby inlining neproběhl:

[MethodImpl(MethodImplOptions.NoInlining)]
public static void ConfigureForWebApplication(this IWindsorContainer container)
{
	container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel));

	container.AddFacility();

	container.Install(FromAssembly.This());
}

Alternativně lze samozřejmě zdrojovou assembly určit jiným determinističtějším způsobem (FromAssembly.jinak()).

Outlook: Jak se zbavit zobrazování pozvánek, na které jsem dosud nereagoval, v kalendáři?

Chodí mi ve formě meeting requestů spousta pozvánek na kde-co a vadí mi, že se mi zobrazují v mém už tak plném kalendáři (jako faded – světlejší), přestože jsem je ještě nečetl, natož abych na ně reagoval. V mém případě se jedná například o různé firemní sportovní aktivity nebo on-line cally Microsoftu pro MVPs, atp.

image

Našel jsem cestu, jak se zobrazování těchto pozvánek v kalendáři zbavit. Možná existuje nějaký jednodušší přepínač (dejte kdyžtak vědět v komentářích), ale mně funguje toto:

Na záložce View, volba Settings:

image

Filter:

image

Záložka Advanced, přidat pravidlo pro Meeting Status (pod All Appointment Fields) not equal to Not yet responded:

image

Add to list, OK, OK:

image

Pravidlo se dá samozřejmě vyladit dle individuální potřeby, např. omezit na „které jsem dosud nečetl“, atp.

Pravidlo je samozřejmě omezeno na View, do kterého jste ho přidali. Používáte-li Views více, je potřeba přidat do všech.

Jak na problém s přechodem Windows do režimu spánku?

Jeden z počítačů, o které se starám, „z ničeho nic“ přestal usínat. Jak jsem danou situaci vyřešil?

Pokud Windows nechtějí přejít do režimu spánku, i když máme vše řádně nastavené, je možné postupovat následujícím způsobem. Spustíme v administrátorském režimu „%SYSTEMROOT%\System32\powercfg /requests“ a vypíše se nám následující tabulka (zde ve Windows 7):

2015-06-17_16-03-46Zde jsou vidět programy, které blokují přechod Windows do režimu spánku.

Zde je to konkrétně TeamViewer, spuštěná webová kamera a zvukový datový proud (byl spuštěný skype). To bylo v pořádku.

Další položkou je „služba zařazování tisku tiskne dokument“. Počítač měl nainstalován driver pro síťovou tiskárnu, která byla vypnutá, ale v tiskové frontě do této tiskárny byly připraveny k tisku dva soubory. A toto nakonec způsobovalo to, že Windows do režimu spánku nepřecházel. Pro opravu stačilo smazat soubory z tiskové fronty.

Hledáme nového kolegu na pozici ASP.NET Developer (C#)

Do našeho týmu hledáme dalšího kolegu na pozici „ASP.NET developer“.

Požadujeme:

  • schopnost produkovat kvalitní aplikace, s citem pro potřeby zákazníka a s osobním uspokojením nad výsledky práce,
  • pokročilou znalost C#, ASP.NET, HTML, CSS, webových technologií, OOP,
  • pokročilé znalosti databázové problematiky (návrh relační DB, MSSQL, T-SQL),
  • důležité jsou osobnostní kvality, otevřená mysl a schopnost učit se novým věcem,
  • znalost ASP.NET MVC může být výhodou, není však podmínkou (drtivá většina našich projektů jsou WebForms),
  • občas se může hodit znalost WinForm, WPF, Flash atp., nicméně není to požadavek,
  • orientace v jQuery, AngularJS, atp. určitě potěší.

Nabízíme:

  • přátelské prostředí střední pracovní skupiny, kde se snažíme, aby práce pro nás byla zábavou,
  • pohodový pracovní režim, kde Vám neprudí 3x denně u stolu obchodník, že zrovna tohle musí být okamžitě hotové, nejpozději hned,
  • relativně volnou pracovní dobu, kde jsou přesčasy naprostou výjimkou a je potřeba podržet kolegu, který domluvil něco, co neměl,
  • práci na zajímavých projektech (především zakázkový vývoj webových aplikací, někdy též vlastní projekty Goran a business.center.cz), neděláme moc webové prezentace,
  • příjemnou vývojářskou práci na vícevrstvých aplikacích, s agilním přístupem, s nejnovějším vybavením (VS2013+, SQL2014, NET4.5+, Win7/8, SSD, 2xLCD, …), s využitím našich knihoven a generátorů kódu, kdy se budete moci věnovat opravdu tvorbě aplikace nad vygenerovaným objektovým modelem, a nebudete trávit dny datlováním stále stejných věcí dokola (přístupů do DB, atp. atp.),
  • odborný rozvoj v kolektivu MVP, MCT, MCPD, MCP kolegů ;-)
  • každý rok týdenní teambuilding na námořní plachetnici, na horách, nebo obdobný (snad to znovu vyjde) ;-)
  • nadstandardní lékařská péče pro všechny naše pracovníky
  • volitelné lekce angličtiny jednou nebo dvakrát týdně (na pracovišti, rodilý mluvčí)

Plný úvazek. Sedíme kousek od Budějovické. Nástup možný ihned, pokud nás však zaujmete, jsme ochotní i počkat po výpovědní dobu dosavadního zaměstnání.

Nekuřácké pracoviště, nekuřák podmínkou.

Zájemci mě kontaktujte s profesními informacemi o sobě na haken_zavinac_havit.cz.

Navrhněte nejraději rovnou dva nebo tři termíny v nejbližších dnech, kdy byste se mohli dostavit k osobnímu setkání. Pošlete:

  • životopis,
  • ukázku svého zdrojového kódu (stačí jeden/dva soubory nebo odkaz na GitHub),
  • odkazy na projekty, kde jste se podstatným způsobem podíleli na vývoji (pokud jsou veřejně dostupné).

Dokud je zde zveřejněno, náš zájem trvá. Žádná formální kola výběrového řízení neorganizujeme, prostě dokud nenajdeme vhodného kandidáta, tak hledáme a vybíráme. Čím dříve se ozvete, tím menší je pravděpodobnost, že už bude pozdě… ;-)

Cookie, case senzitivita a .NET Framework

Chrome a Firefox podporují case-senzitivní cookie.
.NET Framework podporuje case-senzitivní cookie.
Ale pozor, například vyhledávání v kolekci Request.Cookies (Request.Cookies[„xxxxxx“], typ HttpCookieCollection) je case-nesenzitivní, což může vést k nepříjemným chybám.
Pokud cookie přejmenujeme tak, že změníme pouze velikost písmen, tak následně se nám může v kolekci Request.Cookies najít původní cookie místo nové, přejmenované…

Pomalý start programu Microsoft Word

Již se mě na několika počítačích stalo, že MS Word se spouštěl extrémně pomalu. Pomohlo následující řešení. Je třeba smazat soubor „Normal.dot“, „Normal.dotm“ nebo „Normal.dotx“, podle verze MS Wordu. Tento soubor je poškozen. Ve Windows 8, Windows 7 a Windows Vista se některý s těchto souborů nachází zde: „%appdata%\Microsoft\Templates“. Po následujícím spuštění Wordu je soubor znovu automaticky vytvořen.

Microsoft SQL Server – kill locku na databázi

Pokud chceme odblokovat lock-nutou databázi na Microsoft SQL Serveru (například pokud chceme přejmenovat databázi, provést obnovu databáze, výmaz databáze…), lze to udělat následujícími způsoby.

První možností je použít tento kód:

SELECT DISTINCT
  name AS database_name,
  session_id,
  host_name,
  login_time,
  login_name,
  reads,
  writes
FROM sys.dm_exec_sessions
    LEFT OUTER JOIN sys.dm_tran_locks ON sys.dm_exec_sessions.session_id = sys.dm_tran_locks.request_session_id
    INNER JOIN sys.databases ON sys.dm_tran_locks.resource_database_id = sys.databases.database_id
  WHERE name ='NazevMeDatabaze'
  ORDER BY name

Následně se nám objeví, kdo má nad databází zámek:

SQL_select_lock

Pak lze použít například „KILL 68„, čímž zámek uvolníme. Výhodou je, že vidíme, kdo má lock a lze vše ručně řídit. Nevýhodou je, že mohou přibýt další zámky před operací, kterou chceme vykonat.

Další možností je použít tento kód:

ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE
--do you stuff here
ALTER DATABASE YourDatabase SET MULTI_USER

Zde je určitou nevýhodou to, že nám zůstanou na databázi naše vlastní zámky a také to, že můžeme zapomenout vrátit databázi do multi-user režimu. Akce provádíme v místě označeném „do you stuff here“.