Soci (Soczó Zsolt) szakmai blogja

2018.04.26.

DDD Bounded Contextek egy hosting processzben?

Filed under: .NET,Architektúra,DDD,Design,Szakmai élet — Soczó Zsolt @ 12:21

Tegyük fel van egy nagy alkalmazás, amely többé-kevésbé DDD mentén van elkészítve.
Minden terület saját bounded contextben (BC) van, a BC-ek egymás felé csak az apijaikon keresztül kommunikálnak.

A fő cél az lenne, hogy a csapatok/emberek tisztán egy BC-en tudjanak dolgozni, ne kelljen a többit is mindig lefordítani, a méretek miatt. Ezért mondjuk minden BC-ből csak az API komponensét publikáljuk ki, nugetbe csomagoljuk, és így binárisan tudnak egymással kommunikálni a BC-ek. Ez eddig szerintem rendben van, bár a verziózás kérdése itt sem egyszerű, hiába próbáljuk a csatolást az API-kon és az Anti Corruption Layeren (ACL) keresztül lazítani.

A nagy kérdés számomra a közös komponensek használata. “A” BC használ mondjuk 10.1-es NewtonSoft.Json-t, “B” BC pedig 9.0-t. Amikor minden bounded contextet bemásolunk egy website bin könyvtárába, akkor esetleges lesz, hogy melyik verziójú külső komponens lesz bemásolva, illetve a verziókhoz passzoló assembly redirectek is kellenek a web.config-ba.

Hogy szoktak ebben rendet tenni? Vagy megfordítva a kérdést, jó ötlet egy processben hosztolni a BC-eket, vagy ha ennyire laza csatolást akarunk, akkor külön processzbe kell őket rakni, és elkezdeni elmenni a microservices irányba?

Ötletek, linkek, könyvek, bármi érdekel a témában.

2018.04.10.

Ha valaki játszani akar a választási adatokkal

Filed under: Szakmai élet — Soczó Zsolt @ 21:04

[source lang=”csharp”]
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Xml;

namespace ConsoleApp1
{
class Program
{
static void Main()
{
new Program().Run();
}

private void Run()
{
Regex r = new Regex(@".+\\(\w+)\\(\w+).evkjkv.html", RegexOptions.Compiled | RegexOptions.IgnoreCase);

List<string> parties = new List<string>()
{
"FIDESZ",
"JOBBIK",
"MSZP",
"LMP",
"EGYÜTT",
"DK",
};

foreach (var file in Directory.GetFiles(
@"C:\temp\valasztas\valasztas.hu\dyn\pv18\szavossz\hu\", "evkjkv.html", SearchOption.AllDirectories))
{
var d = FromHtml(file);

IEnumerable<string> cols = parties.Select(p =>
{
var part = GetVotes(d, file, p);
return $"{p},{part}";
});
string res = string.Join(",", cols);
var m = r.Match(file);
Console.WriteLine($"{m.Groups[1]},{m.Groups[2]},{res}");
}
}

private static string GetVotes(XmlDocument d, string file, string party)
{
var n = d.SelectSingleNode($"//tr[td[starts-with(text(), ‘{party}’)]]");
if (n == null)
{
return "0";
//Console.WriteLine($"Skipping {file} because there is no data for {party}");
}

//Console.WriteLine(n.InnerXml);
return n.SelectSingleNode("td[4]").InnerText.Replace("&amp;", "").Replace("&nbsp;", "");
}

XmlDocument FromHtml(string path)
{
using (TextReader reader = File.OpenText(path))
{
XmlDocument doc;
using (var sgmlReader = new Sgml.SgmlReader
{
DocType = "HTML",
WhitespaceHandling = WhitespaceHandling.All,
CaseFolding = Sgml.CaseFolding.ToLower,
InputStream = reader
})
{
doc = new XmlDocument
{
PreserveWhitespace = true,
XmlResolver = null
};
doc.Load(sgmlReader);
}

return doc;
}
}
}
}
[/source]

Powered by WordPress