Barış Velioğlu'nun Programlama Notları
inicio mail me! sindicaci;ón Barış Velioğlu'nu takip et

Server.MapPath Kullanımı ve (.) (..) (~) (/) Aralarındaki Farklar

Server.MapPath fiziksel dizinle eşleşen relative ya da virtual path’i belirtir.

  • Server.MapPath(“.”) (e.g. aspx) çalıştırılan dosyanın o anki fiziksel dizininin yolunu döndürür
  • Server.MapPath(“..”) bir üst dizinin yolunu döndürür
  • Server.MapPath(“~”) uygulamanın bulunduğu ana dizinin fiziksel yolunu döndürür
  • Server.MapPath(“/”) domainin bulunduğu fiziksel dizin yolunu döndürür (bu uygulama ana diziniyle aynı olmak zorunda değil)

Örneğin:

(http://www.example.com/) isimli web uygulamanız aşağıdaki fiziksel adreste bulunsun.

C:\Inetpub\wwwroot

ve alt bir alışveriş uygulamanız da (IIS’de virtual directory olarak bulunan ve uygulama olarak işaretlenmiş) aşağıdaki fiziksel adreste bulunsun.

D:\WebApps\shop

Bu durumda eğer Server.MapPath methodunu aşağıdaki istek içerisinde çağırdığınız dönen sonuçlara sırasıyla bakalım.

http://www.example.com/shop/products/GetProduct.aspx?id=2342
  • Server.MapPath(“.”)
    D:\WebApps\shop\products
  • Server.MapPath(“..”)
    D:\WebApps\shop
  • Server.MapPath(“~”)
    D:\WebApps\shop
  • Server.MapPath(“/”)
    C:\Inetpub\wwwroot
  • Server.MapPath(“/shop”)
    D:\WebApps\shop

 

Kaynakça: http://stackoverflow.com/questions/275781/server-mappath-server-mappath-server-mappath-server-mappath

Konuşma ve Öğretme Arasındaki Fark

Öğretmenlik altyapısıyla konferanslarda birçok kez “konuşma” yaptım. Lisede üniversite seviyesinde eğitimler verdim ve birçok kişinin “iş eğitimi” dediği eğitimlerde verdim. Her zaman konuşma ve öğretme arasındaki farka vurgu yaptım. Neden ? Çünkü onlar farklı. En azından ben öyle olduğunu düşünüyorum.

Konuşma Nedir ?

Eğer bir konferansta 45 dakikalık bir oturumda “konuşuyorsanız”, genellikle bu sizin orada sahnede bulunup slaytların üstünden geçtiğinizi, dinleyiciyle konuştuğunuzu, en basit şekliyle elinizdeki materyalleri kullanarak bir sunum yaptığınızı gösterir. Onlara birşeyler anlatır ya da yaptığınız işle ilgili örnekler gösterirsiniz. Ben buna “konuşma” diyorum. Siz ya da konferansı ayarlayan kişi sizin özgün konularda konuşacak, paylaşacak şeylerinizin olduğuna karar vermiştir. Konuşma sahip olduğunuz bilgiyi dinleyiciye vermektir. Fakat “öğretmek” ne gerektirir ? Nasıl farklı olabilir ?

Öğretmek Nedir ?

Eğer öğretiyorsanız, öğreneni düşünüyorsunuzdur. Hani şu dinleyicilerinizi. Onların ruh halini, aldığı eğitimi, bilgisini, tecrubesini düşünüyorsunuzdur. Onların neye ihtiyacı olduğunu, çıkıp islerini daha iyi nasıl yapabileceklerini ya da harekete geçip dünyayı nasıl değiştirebileceklerini düşünüyorsunuzdur. Bu durumda onlara öğrenme hedefleri oluşturacaksınız ( Bu dört yıl soruyla başlamayı seviyorum – Onların ne bilmesini istiyorsun ? Onların ne yapmasını istiyorsun ? Onların ne hissetmesini istiyorsun ? Onların kim olmasını istiyorsun ? ), çokça zaman harcayacaksın ve onların şuanki bilgi birikimini, yeteneklerini ve fikirlerini onların olmasını istediğiniz noktaya getirmek için neler yapmanız gerektiğini düşüneceksiniz. Onlara bir deneyim sunacak, mantıksal bilginin yolunu göstereceksiniz.

Ayrıca dinleyicilerinize sormak istediğiniz anahtar soruları bulup, onların ne anladığını değerlendireceksiniz. Cevapları dinledikten sonra onları düşünmeye sevk edecek şeyler yapacaksınız. Deneyler yapılıp, hedeflerin görselleştirilmesi ve örneklerin analizleriyle onları götürmek istediğiniz yola sokmaya yardımcı olacaksınız.

Elbette bazı konuşmacılar bunları yapıyor ve yaptıklarında onlar bir konuşmacıdan ziyade bir öğretmene benziyorlar. Ve evet, yukarıda bahsettiklerimden çok daha fazlasının olduğuna eminim ama benim için aralarındaki farkın birçoğunu bunlar oluşturuyor.

Eğer konuşma, konuşmacının sahip olduğu bilgiyi dinleyiciye aktarmaksa, öğretme de, bunları eğiticinin tecrübesiyle harmanlayıp dinleyicilerin kendi kendi kendilerine yeni şeyler keşfetmesine, yeni bilgiler üretmesine yardımcı olmaktır.

Sonraki Soru ?

Sizin için kolay bir soru : Siz hangisi olmak istersiniz ? Sahnedeki bilge (dinleyicilerle konuşan bir konuşmacı) ya da sahadaki rehber (dinleyiciyle bütünleşen öğretmen) ? Ben ne olmak istediğimi biliyorum. Her zaman.

Orjinal metin :The difference between speaking and teaching
Çeviri : Barış Velioğlu

Buglara Bir de Bu Açıdan Bakalım

bugs

Entity Framework Code First’de Veritabanını Yeniden Oluşturamama Sorunu – Cannot drop database “DatabaseName” Because it is currently in use

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.

cannotdropdb

İ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

ASP.NET MVC View Sayfalarına Yeni Özellikler Eklemek

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.

webviewpage

Ö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.)

webviewpage2

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.

webviewpage3

GetLocalizedValue isimli method artık viewlerimizde kullanılmaya hazır.

İyi çalışmalar,

ASP.NET MVC’de AutoFac ile FluentValidation Kurulumu

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,

Önceki Yazılarım