Mayıs 17, 2013 at 11:42 · Kategori: .NET, .NET MVC, C#, Entity Frameworkv5
Entity Framework CodeFirst ile uygulama geliştirirken, açık kalan bir connection veritabanında değişiklik yapılmak istenildiğinde aşağıdaki hataya sebebiyet veriyor.

İlgili veritabanındaki aktif bağlantıları kapatarak bu sorunun üstesinden gelebilirsiniz ama bitmemiş bir işlemin rollback işlemine tabi tutulacağını unutmayınız.
use master
ALTER DATABASE VeritabaniAdi
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE VeritabaniAdi SET MULTI_USER
Referans : How do you kill all current connection in sql server
Mayıs 17, 2013 at 10:35 · Kategori: .NET MVC
MVC’de viewler içerisinde temel bazı özelliklere otomatik olarak sahip oluyoruz. Örneğin Model, ViewData gibi özelliklere direkt olarak erişebiliyoruz. Peki bunlar nereden geliyor ? Web Forms View Engine System.Web.UI.Page‘den türerken, Razor-based Viewler WebViewPage isimli abstract sınıftan türemektedir.
System.Web.Mvc dll’ini decompile edelim ve WebViewPage sınıfının bir kısmına bakalım.

Örneğin; viewleriniz içerisinde çok dilliği sağlamak için bir methoda ihtiyaç duydunuz. Direkt olarak WebViewPage isimli sınıftan yeni bir sınıf türeterek bunu gerçekleştirebiliriz. (Normal şartlarda direkt method kullanmak yerine, burada delegate kullanmayı tercih ederim. Ancak örneği karmaşıklaştırmak istemedim.)

Artık tüm viewlerimizin yeni oluşturduğumuz bu sınıftan türemesi istiyorsak, MVC projemizdeki Views klasörü altında bulunan web.config içerisinde pages elementine aşağıdaki gibi yeni oluşturduğumuz sınıfın adını namespace’i ile birlikte yazıyoruz.

GetLocalizedValue isimli method artık viewlerimizde kullanılmaya hazır.
İyi çalışmalar,
Mayıs 11, 2013 at 10:42 · Kategori: .NET MVC, AutoFac
FluentValidation, modellerinizi akıcı ve kolay bir şekilde doğrulamanızı sağlayan güçlü bir kütüphane. Kurulumu oldukça basit. NuGet Package Manager’ı açıp konsola Install-Package FluentValidation.MVC4 yazıyorsunuz ve işlem tamam. Ayrıca FluentValidation kütüphanesini bir IoC container yardımıyla kullanmak da mümkün. Bu yazımda benim genelde sıkça kullandığım IoC container olan AutoFac ile kurulum için gerekli kodları paylaşacağım.
public class DomainValidatorFactory : ValidatorFactoryBase
{
public override IValidator CreateInstance(Type validatorType)
{
return DependencyResolver.Current.GetService(validatorType) as IValidator;
}
}
public class DependencyRegistrar
{
#region Singleton
private DependencyRegistrar()
{
}
private static readonly Lazy< DependencyRegistrar> _lazyInstance = new Lazy< DependencyRegistrar>(() => new DependencyRegistrar());
public static DependencyRegistrar Instance { get { return _lazyInstance.Value; } }
#endregion
public static IContainer Container { get; private set; }
private static ContainerBuilder _builder;
public static ContainerBuilder Builder
{
get { return _builder ?? (_builder = new ContainerBuilder()); }
}
public virtual void Register()
{
Builder.RegisterControllers(Assembly.GetExecutingAssembly());
Builder.RegisterType< DomainValidatorFactory>().As< IValidatorFactory>();
AssemblyScanner.FindValidatorsInAssembly(Assembly.GetExecutingAssembly()).ForEach( x => Builder.RegisterType(x.ValidatorType).As(x.InterfaceType));
Container = Builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(Container));
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(Container.Resolve< IValidatorFactory>()));
}
}
Örnek bir doğrulama sınıfı
public class PersonValidator : AbstractValidator< Person>
{
public PersonValidator ()
{
RuleFor(x => x.FirstName).Length(3,20).WithMessage("İsim alanı en az 3, en çok 20 harften oluşabilir");
RuleFor(x => x.Url).NotEmpty().WithMessage("Url alanı boş bırakılamaz");
}
}
Geriye kalan son adım Global.asax’da Application_Start() methodu içerisinde DependencyRegistar sınıfına ait olan Register methodunu çalıştırmanız.
Örn:
DependencyRegistrar.Instance.Register();
Bu konuyla ilgili bir sonraki yazımda FluentValidation kütüphanesini çok dilli bir uygulama için nasıl kullanabileceğimizden bahsedeceğim.
İyi çalışmalar,
Ocak 20, 2013 at 12:28 · Kategori: Genel
Sektörde her zaman sıfır proje geliştirme fısatı bulamıyoruz. Bazen mevcut projelere yeni özellikler ekliyor, bazen de çıkan bugları düzeltiyoruz. Eğer siz sürekli yeni yazılımlar geliştirme fırsatı bulduğunuz bir yerde çalışıyorsanız, o trenden atlamadan önce bir kez daha düşünmelisiniz. Zira çoğumuz bizden sonraki yazılımcılara anlaşılır kodlar bırakmıyoruz.
Bunun anlamı miras projeler onunla ilgilenen yazılımcının kucağında büyüyen bir bomba haline geliyor ve en temelde maliyetler sebebiyle bu bomba birinin kucağında patlayana kadar yazılımı geliştirmeye çalışmaya devam ediyoruz.
- Ali : Dostum burada ne yapmak istenmişsin ?
- Ulvi: Açıkcası ben orayı başka bir yerden çakıp geçmiştim. Uğraşma çak geç sen de.
- Ali : 2 saat içerisinde çıkarmam gerek bu işi, çakıp geçiyorum öyleyse.
2 hafta sonra…
- Ali : Lan kampanya modülü patlamış. İki haftadır sitedeki kampanyalar düzgün çalışmıyor. Müşteri deliye döndü. Patron köpürüyor.
- Ulvi: ?!!!
Burada elbette tüm suç yazılımcının değil ancak kötü kodu yazan bizleriz. Yani en büyük sorumluluk bize düşüyor. Kötü koda sahip miras projelerde verimlilik gün geçtikçe düşmeye devam ediyor. 2 saatte yapılması planan iş yarın 3 saat, bir sonraki ay 6 saat sürmeye başlıyor. Bir süre sonra artık yazılım geliştirilemez hale geliyor.
Uncle Bob’un Temiz Kod (Clean Code) isimli eserinde gördüğüm resim aslında iyi kod ile kötü kod arasındaki farkı çok iyi özetliyor. Resim her ne kadar code review sırasındaki durumu anlatsada buna kod geliştirme aşamasını da dahil edebiliriz.

Resmi Türkçeleştirmek gerekirse iyi kod ile kötü kod arasındaki fark, kod incelendiği sırada bir dakika içerisinde sarfedilen ortalama “Bu ne AMK?!” sayısıyla ölçülebilmektedir.
Bu konuyla ilgili bir sonraki yazımda iyi kod yazma tekniklerine örneklerle giriş yapacağım.
Temiz çalışmalar.
Ocak 4, 2013 at 22:53 · Kategori: .NET, C#
TypeConverter ile çeviri işlemi yaparken dikkat edilmesi gereken hususlardan biri converter’ın alt tarafta çalıştırdığı Double.Parse methodunun NumberStyles.AllowThousands özelliğini varsayılan olan kabul etmemesidir. Bu sebeple binlik ayracı içeren değerler(1.000.000) için not a valid value for double şeklinde bir hata almamız olasıdır.
Bu sorunun üstesinden gelebilmek için çeviricinize DoubleConverter olduğu zamanlar ek bir durum ekleyebilirsiniz.
TypeConverter converter = TypeDescripter.GetConverter(type);
if(converter is DoubleConverter){
Double.Parse("1.000,50", NumberStyles.Float | NumberStyles.AllowThousands)
}
Yukarıdaki örnekte System.Globalization.NumberFormatInfo için NumberGroupSeperator’ın “.“, NumberDecimalSeperator’ın ise “,” olduğu gözardı edilmemelidir. Yani uygulamamız binlik ayracı için noktayı, küsürat ayracı için virgülü kullanmaktadır.
Bu değerlerin uygulamanızın CurrentCulture özelliğinden varsayılan olarak geldiğini hatırlatmakta fayda var. CurrentCulture’ı ya da NumberFormatInfo nesnesini nasıl değiştirebileceğinizin yöntemlerini ek bilgi olması amacıyla ekliyorum. Konunun devamında bu bilgiye ulaşabilirsiniz.
Yazının Devamını Oku
Ocak 4, 2013 at 17:40 · Kategori: JavaScript, Jquery
Uzun zamandır yazmayı planladığım başka bir javascript kütüphanesi de input alanlarına giriş yapılırken kullanıcının belli sayısal kurallara uymasını sağlamak ve giriş yapılan değerin yine belirlenen kurallara göre yazıldığı anda formatlanmasını sağlamaya yönelikti.
Kısaca kullanıcı input alanını doldurmaya başlarken ilgili rakamlar belirlediğiniz kurallara göre formatlanmaya başlıyor. Neredeyse her uygulamada böyle bir şeye ihtiyaç duyuyor ancak tam olarak ihtiyaçlarımı karşılayacak bir kütüphane bulamıyordum. Şimdilik Türk Lirası karakterini (Çapa) koyamasam da TL desteği koyduğum kütüphaneyi buraya tıklayarak test edebilirsiniz.

Kullanımı
Yukarıdaki inputlar için uygulama sırası aşağıdaki gibidir.
$('.numeric1').numeric({fraction : 2, symbol: "TL"});
$('.numeric2').numeric({fraction : 0, symbol: "TL"});
$('.numeric3').numeric({fraction : 0, symbol: "$"});
$('.numeric4').numeric({fraction : 2, symbol: "$"});
$('.numeric5').numeric();
$('.numeric6').numeric({fraction : 2});
Kütüphaneyi indirmek için buraya tıklayınız.
Önceki Yazılarım