Category Archives: .NET Framework

Novinky ve VS 15.6, C# 8.0, .NET 4.7.3 a Blazor [Robert Haken, HAVIT Vzdělávací okénko 15.3.2018]

Záznam ze Vzdělávacího okénka HAVIT z 15. března 2018. Je publikován na našem HAVIT YouTube Channelu.

Dotčená témata:

  • Novinky ve Visual Studio 2017 verze 15.6
    • Navigate to Decompiled Sources
    • Test Explorer Hierarchy View
    • GIT tags
  • Novinky v C# 7.3 a C# 8.0
    • Tuple Equality Operators
    • Generic Constraints on Delegate, Enum
    • Native-sized numeric types
    • Records
    • Asynchronous Streams (Enumeration) and Disposables
    • Nullable Reference Types
    • Extension Everything
  • Blazor (Browser + Razor, WebAssemblies)

Visual Studio a C# vNext – záznamy, dema [G2B TechEd Brno, ShowIT Bratislava, 01/2018]

Záznamy stejné přednášky z konferencí G2B TechEd Brno a ShowIT Bratislava.

Brněnská verze z 30.1.2018 se musela vmáčknout do 45 minut:

Bratislavská verze z 31.1.2018 měla prostor 70 minut:

Záznamy jsou uloženy na našem HAVIT YouTube Channelu.

Dotčená témata:

Materiály z přednášky:

Programátorská hádanka: Exceptions

Co bude výstupem?

try
{
  try
  {
    throw new Exception("A");
  }
  catch
  {
    throw new Exception("B");
  }
  finally
  {
    throw new Exception("C");
  }
}
catch (Exception ex)
{
  Console.Write(ex.Message);
}

Výsledek: https://dotnetfiddle.net/6SWPqL

Quartz.NET, Castle Windsor – LifeStyle Per Job (Scoped)

Pokud používáte Quartz.NET (známá knihovna pro job-scheduling) s Castle Windsor (IoC/DI container), možná jste narazili na potřebu registrovat komponentu s životním cyklem „per job“ (LifestylePerJob). Na internetu najdete několik možností, které mají jedno společné – nefungují:

  • LifestylePerThread – neresetuje thread mezi joby, komponenta se použije pro více jobů
  • BoundTo<Job>() – nepodporuje typed factories, pokud si z nich vyžádáte službu v jobu
  • BoundTo<object>() – nepodporuje typed factories, pokud si z nich vyžádáte službu v jobu
  • Quartz.IJobFactory + LifestyleScoped – nepodporuje typed factories, pokud si z nich vyžádáte službu v jobu (scope odstartovaný v JobFactory se nezpropaguje do jobu!)

Naštěstí existuje „jednoduché“ řešení. Můžete použít LifestyleScoped, ale je potřeba scope začít/ukončit uvnitř jobu.

Pokud použijete samotný job jenom jako plumbing class kde práce samotná je zapouzdřena do samostatné služby (a měli byste to tak mít tak jako tak), pak stačí do jobu nainjectovat factory k takové službě a kernel pro ovládání scope:

public class MyJob : IJob
{
    private readonly IServiceFactory&lt;myservice&gt; myServiceFactory;
    private readonly IKernel kernel;

    public MyJob(IServiceFactory&lt;myservice&gt; myServiceFactory, IKernel kernel)
    {
        this.myServiceFactory = myServiceFactory;
        this.kernel = kernel;
    }

    public void Execute()
    {
        using (var scope = kernel.BeginScope())
        {
            // use your way to work with factories ;-)
            using (var myService = myServiceFactory.Create())
            {
                myService.DoWork();
            }
            // BTW: we have an extension method
            myServiceFactory.ExecuteAction(service =&amp;gt; service.DoWork());
        }
    }
}

…třída MyService class má všechny dependencies, které potřebuje a při použítí přes factory tím získáte nový pseudo-resolution-root. Svádí to samozřejmě použít rovnou kernel.Resolve+Release, ale nedělejte to… ;-)

References