Angular dinamik component css sorunu

Angular (2+) da componentin css dosyasına  örneğin .custom-css yazıp kullandığımızda

.custom-css[_ngcontent-c57] { color: red; }

olarak render oluyor. Bu css dosyamızın component bazlı olmasını sağlıyor lakin dinamik component kullandığımızda css .custom-css[_ngcontent-c57]  olup html render edildiğinde .custom-css[_ngcontent-c58]  olabiliyor.  bu durumda angular component dosyamıza gelip encapsulation: ViewEncapsulation.None  dememiz yeterli.

Screenshot_5

Burada dikkat etmeniz gereken tek durum .custom-css sadece o componenti işaret edecek şekilde yazmak ve tüketmek. genel tanımlamalar kullanmamak.

kaynak: https://coryrylan.com/blog/css-encapsulation-with-angular-components

Reklamlar

Jetbrain .net idesi Rider hakkında görüşlerim/incelemem

Yıllardır .net ekosistemindeki en güzel şey visual studio diye düşünürüm. Yani öyle daha iyi bir ide arayışım yoktu. Hata Winform kodladığımız zamanlarda sürükle birak çok stabil çalıştığı için ayrı bir severdim. Uzun zamandır web kodluyorum. visual studio 2017 + ReSharper biraz bilgisayarımda kasmaya başladı (Asus GL550JK-CN391H) bende  Jetbrain Rider denemeye karar verdim. Şimdi intellij vesilesi ile hep “adamlar ide işinde çok iyi” denildiğini duymuştum ama .net developer olarak hiç deneyimlememiştim. (bir ara javascript için Webstorm denemiştim ama basit gereksinimlerim olduğu için ek editor açmak kullanışlı gelmememişti.Vs FOREVER 🙂 )

  • Daha hızlı ve hafif
  •  Debug modda açıp c# da kodunu break pointe gelmesini beklemeden düzenleyebiliyoruz.
  •  Visual studio kısa yol ve işlevlerini destekliyor. alışkanlıklarımızın çoğunu taşıyabiliyoruz.
  • “Documant Format (ctrl K + D)” daha akıllı çalışıyor.
  • new Product().var (tab tab)  dediğimiz zaman otomatik olarak var product=new Product(); diyerek bize isimlendirme konusunda yardımcı oluyor. (R# gibi)

Eksikler
– Emmet entegrasyonu vs essential eklentisi ile tab ile çalışıyordu. Burada o şekilde çalıştıramadım
– Ctrl + T (search everywhere) fonksiyon adı ve parametrelerde aramıyor. Ciddi eksiklik ama düzelir bence.
-Invidual Developer için visual studio comunity free iken bu araç yıllık 139$ (bireysel geliştirici için fiyat fazla gibi) ama opensource projeler ,usergrouplar ve öğretmen/öğrenci için ücretsiz lisans veriyorlar. (codefiction.tech etkinliklerde jetbrain lisansı hediye ediyor.) Ek olarak +40 dolar daha verirsek vs için resharper dahil oluyor. Hak ediyor mu? Biraz pahalı ama güzel araç. ,

Asp.net içerisinde bir işlemin sistem geneli aynı anda sadece bir kez çalışmasını sağlamak.

Asp.net projemizde doğal olarak birden fazla istek benzer zamanlarda gelebiliyor. Örnek verelim bir barkod veriyoruz. Elimizde bir barkod aralığı var. işlemimiz talep geldiğinde aralığı ilerletip oradaki rakamı bir sonraki değeri ürüne aratayacağız. Hali ile veri bütünlüğünü sağlamak için transaction kullanıyoruz. Ancak aynı anda iki kişi istek yapınca işler karışmasın istiyoruz. Ben öncelikle transaction isolation level değerimizi değiştirerek denedim.  “SERIALIZABLE” seviyesinde tüm tabloyu kitliyor lakin ben mi hata yaptım bilmiyorum ancak aynı anda işlem yaptığında birisi hata veriyordu. En güzel çözüm aslında bir kuyruk yapısı kullanmam ve bir consumer sıradan bu istekleri işlemesi ancak kullanıcı bir sonuç dönmem gerekiyordu ve bir message queue yapısı projeye kurmak istemedim. Çözüm olarak olarak https://github.com/madelson/DistributedLock/ kütüpanesini kullandım. Özetle timeout süresince block içerisinde   verdiğimiz işlemi yapıyor ve işlem bittiğinde bir sonraki istek yapan kısım çalışıyor ve bu durum sadece o kodu kullanan kısımları etkiliyor.

var myLock = new SystemDistributedLock("SystemLock");

using (myLock.Acquire())
{
	// this block of code is protected by the lock!
}

Bu şekilde bir kullanımı var ancak ben bi tık abstract edip

public static class SystemLock {
public static void Lock(string key, Action action) {
var @lock = new SystemDistributedLock(key);
using(@lock.Acquire())
{
action();
}
}
}

Kullanımımız SystemLock.Lock(“BarkodAta”, () => { SetBarcod(“9780123456786”); } )

Eğer sizin daha iyi çözümleriniz varsa lütfen benimle de paylaşınız.

DropdownList EditorFor ile kullanırken model binding sorunu çözümü

Basıtçe anlatırsak ben temel elementlerimin tasarımlarını tek merkenden belirlemek ve hersefer en basidi form-control css vermek istemiyorum. o yüzden EditorTemplates kullanıyorum ve nesnelerimi üretmek için aşağıdaki kodu kullanıyorum. Lakin model dolu olmasına rağmen dropdownlist yani select seçili gelmiyor. Malesef bu bir bug (mış link:)

@Html.EditorFor(model => Model.CountryId, “SelectList”, Model.CountryList)

View de Shared içerisinde EditorTemplates içerisinde selectList.cshtml dosyam

@model object

@Html.GetDisplayName(model => model)

@Html.DropDownListFor(model => model, (SelectListItem[])ViewData[“SyncRoot”], “Lütfen seçiniz”, new { @class = “form-control” })
@Html.ValidationMessageFor(model => model)

</div>

bunu düzeltmek için İtem atama işlemini değiştirmemiz gerekiyor.

@model object

@Html.GetDisplayName(model => model)
@{
var syncRoot = (SelectListItem[])ViewData[“SyncRoot”];
SelectList itemList = itemList = new SelectList(syncRoot, “Value”, “Text”, Model);
}

@Html.DropDownListFor(model => model, itemList, “Lütfen seçiniz”, new { @class = “form-control” })
@Html.LangValidationMessageFor(model => model)

</div>

Böylece sorun düzeliyor.
Kaynak: https://stackoverflow.com/questions/20390052/dropdownlistfor-inside-editorfor-not-selecting-values

Soft Delete için DynamicFilter kullanımı

Tablomda isdeleted kolonu true olanların entity framework içinde sorgularda ek bir işlem yapmadan sorgulara bu şartın eklenmesini sağlamak istiyorum. Büyük feyiz kaynağı asp.net boilerplate bunu nasıl yapmış diye bakarken  “EntityFramework.DynamicFilters” isimli nuget paketini kullandığını gördüm. Kısaca bu nasıl imlemente ediliyor dersek nuget ile yüklüyoruz ve context nesnemize aşağıdaki kodu eklememiz yeterli

https://github.com/zzzprojects/EntityFramework.DynamicFilters

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Filter(“IsDeleted”, (IEntity d) => d.IsDeleted, false);
}

Buradaki IEntity benim bütün entity classlarında bulunan ortak atanın interface i. içerisinde Id ,CreateDate,UpdateDate, isDeleted propertyleri tutuyor.

AutoMapper ile collection esleşmesi yaparken oluşturmak (re-create) değil varolan datayı düzenlemek

Kısaca sorundan bahsedeyim elimde bir entity var ve insert edildiği anda bir çok ek subclass da ekleniyor. Örneğin makale ve makalenin etiketleri gibi. Sorun: AutoMapper varolan bir nesneyi yeni instance veya varolan bir instance üzerinde değiştirerek ekleyebiliyor.

MainModel model= Mapper.Map<MainModel>(entity);

Bu bize yeni MainModel türünde veri dönderir ve map kurallarına göre eslesen alanları doldurur. Modelde olmayan nesneler Default değerleri alır. Edit yaptığımız senaryolarda genelde

Mapper.Map(model, entity);

Kullanırız ki bu bize entity üzerinde sadece modelde olan alanları değiştirme imkanı verir. Ancak sorun şu ki alt sıfırlar için varolanın üzerine ekle gibi bir özellik yok. bu da entity nesnemizde olup modelde olmayan değerlerimizin kaybı anlamına geliyor.

https://dotnetfiddle.net/Vf41J7

Veya gist hali https://gist.githubusercontent.com/mahmut-gundogdu/e545ac1bd9818c400c0a486fd266f47a/raw/2380f08c4bc6a86f0d8a5214a762a654f4b33760/SorununCozumu.cs

Çözümümüz: AutoMapper.Collection nuget paketi. Özetle iki collection arasında eslesme yapıyor ve varolan class diğeri üzerinde değiştererek dönüyor. Böylece sadece model nesnesinde olan değerler etkileniyor diğerleri null veya 0 (yani default değerleri) olmuyor.

https://dotnetfiddle.net/495XGl

veya gist hali https://gist.githubusercontent.com/mahmut-gundogdu/e545ac1bd9818c400c0a486fd266f47a/raw/2380f08c4bc6a86f0d8a5214a762a654f4b33760/SorununTemsil.cs