MVC'yi Windows Forms ile Uygulama


102

Windows Forms'da MVC modelini tam olarak nasıl uygulayacağıma dair iyi bir örneği nerede bulabilirim?

Çeşitli sitelerde (örneğin, The Code Project ve .NetHeaven) birçok öğretici ve kod örneği buldum , ancak birçoğu gözlemci modelini MVC'den daha fazla temsil ediyor. Geliştirmek istediğim uygulama bir okul projesi için olduğundan, PureMVC veya MVC # gibi çerçeveleri kullanmak konusunda isteksizim .



Yanıtlar:


115

Uygulamaların birbirinden çok farklı olduğu görüşündeyim ve uygulamaların nasıl yazılması gerektiğine dair anlayışımız hala çok sınırlı. Üzerinde çalıştığım geçmiş Windows Forms uygulamaları birbirinden çok farklıydı. Gördüğüm tasarım farklılıklarından bazıları (çoğu kombinasyon dahil):

  • Veritabanıyla doğrudan konuşun (2 katmanlı)
  • Verilen uygulama için yazılmış bir arka uç kullanın (3 katman)
  • Birçok uygulama tarafından kullanılmak üzere yazılmış ve uygulamanız için değiştirilemeyen bir dizi web hizmeti kullanın. (Servis Odaklı Mimari)
  • CRUD işlemleri tarafından yapılan güncellemeler
  • Komut kalıbı ile yapılan güncellemeler (arka uç sunucusuna komutlar gönderme)
  • Çok sayıda veri bağlama kullanımı / veri bağlama kullanımı yok
  • Çoğu veri, standart ızgara kontrollerinde iyi çalışan / UI verilerinin çoğu için özel kontrollere ihtiyaç duyan "tablo benzeri" (örn. Faturalar) şeklindedir.
  • 10 veya 20 geliştiriciden oluşan bir geliştirici / ekip (yalnızca kullanıcı arayüzünde)
  • Taklit vb / birim testleri kullanmadan birçok birim testi

Bu nedenle, her zaman iyi uyan bir MVC (veya MVP) uygulaması oluşturmanın mümkün olduğunu düşünmüyorum.

MVC'yi ve neden bir MVC sisteminin bu şekilde inşa edildiğini gerçekten açıklayan gördüğüm en iyi gönderiler , Jeremy D Miller'ın "Kendi CAB'nizi Oluşturun" serisi . Yine de çalıştıktan sonra seçeneklerinizi çok daha iyi anlayabilmelisiniz. Microsoft'un Akıllı İstemci Kılavuzu (CAB / Microsoft Kompozit Uygulama Bloğu) da dikkate alınmalıdır. Biraz karmaşıktır, ancak iyi uyan uygulamalar için iyi çalışabilir.

Bir Winforms Projesi için MVC / MVP Uygulamasının seçilmesi , okumaya değer bir genel bakış sağlar. Çoğu insan PureMVC'yi sever . Hiç kullanmadım, ancak bir dahaki sefere bir MVC çerçevesine ihtiyacım olduğunda ona bakardım.

" Presenter First ", Model View Presenter (MVP) tasarım modeli ile test odaklı geliştirmenin fikirlerini birleştiren bir yazılım geliştirme yaklaşımıdır . Müşterinin dilinde testler yazarak başlamanıza olanak tanır. Örneğin:

"'Kaydet' düğmesini tıkladığımda dosya kaydedilmeli ve kaydedilmemiş dosya uyarısı kaybolmalıdır."

"Presenter First" ü kullanma deneyimim yok, ancak çok umut verici göründüğü için bir şans bulduğumda deneyeceğim.

Bakmak isteyebileceğiniz diğer Stack Overflow soruları burada ve burada .

Herhangi bir noktada WPF kullanmayı düşünüyorsanız , Model-View ViewModel (MVVM) modeline bir göz atın . İşte göz atmanız gereken çok güzel bir video: Model-View-ViewModel'de Jason Dolinger .

MVVM (Model Görünüm Görünüm Modeli) Winforms için Tasarım Modeli, gerektiğinde WPF'ye dönüştürmeyi kolaylaştırabilecek başka bir seçenek sunar. Magical.Trevor , Windows Forms için özellik adlarına dayalı otomatik bağlama da içeren başka bir MVVM örneğidir.


Ayrıca kendinize neden MVC kullandığınızı sorun .

  • Mümkün olduğunca çok sayıda kodu birim test edebilmek ister misiniz?
  • Mümkün olduğunca çok kodun yeniden kullanılmasına izin vermeye mi çalışıyorsunuz?
  • Kod tabanınızın anlaşılmasını kolaylaştırmaya mı çalışıyorsunuz?
  • Belirli bir proje için geçerli olabilecek diğer 101 neden.

Eğer açıkça ifade kere amaçlarından , bu bir uygulama ya da başka bir seçim yapmak daha kolay olur.


@AgnelKurian, CAB, Microsoft'tan uygulamaların nasıl geliştirileceğine dair bir dizi örnek koddu - şimdi çoğunlukla tarih oldu.
Ian Ringrose

Haha! Evet, şu "Uygulama Bloklarını" hatırlıyorum.
Agnel kurian

45

GÜNCELLEME: Aşağıdaki önceki cevabıma ek olarak, "Önce Sunucu" yaklaşımı hakkında (özellikle PDF makaleleri) okumanızı öneririm

MVC yerine MVP'yi (aslında PassiveView kalıbı) öneririm. Bunun için gerçekten herhangi bir özel çerçeveye ihtiyacınız yok, sadece kodunuzu düzenleme şekliniz.

(Genellikle benimsediğim) bir yaklaşım, her bir pencere formunu üç varlığa bölmektir:

  1. Bir sunucu / denetleyici sınıfı - bir form geliştirirken aslında başladığınız şey budur. "İş" mantığınızın çoğunun / tümünün bulunması gereken yer burasıdır.
  2. Yöntemleri, özellikleri ve olayları içeren bir görünüm arayüzü (IView). Bu arayüz, sunum yapan kişinin formunuz hakkında bildiği her şeydir.
  3. Sonunda, sunum yapan kişiyi ve görünümü (birim testleri dahil) uygulamayı bitirdiğinizde, gerçek form sınıfını oluşturabilir ve IView arabirimini uygulamasını sağlayabilirsiniz. O zaman sadece forma uygun kontroller eklemek ve bunları arayüze bağlamak yeterlidir.

Örnek kod (basit bir sözde kod, sadece gösterim amaçlı):

interface IView
{
    string Username { get; set; }
    string Password { get; set; }

    event EventHandler LogOnButtonClicked;

    void InformUserLogOnFailed();
    void MoveToMainScreen();
}

class Presenter
{
    public Presenter(IView view)
    {
        this.view = view;
        view.LogOnButtonClicked += new EventHandler(OnLogOnButton);
    }

    private void OnLogOnButton()
    {
        // we ask some service to verify the username/password
        bool isLogOnOk = logOnService.IsUserAndPasswordOk(view.Username, view.Password);
        if (isLogOnOk)
            view.MoveToMainScreen();
        else
        {
            view.Username = "";
            view.Password = "";
            view.InformUserLogOnFailed();
        }
    }

    private IView view;
}

class Form : IView
{
    public Form()
    {
        presenter = new Presenter(this);
    }

    public string Username
    {
        get { return TextBoxUsername.Text; }
        set { TextBoxUsername.Text = value; }
    }

    public string Password
    {
        get { return TextBoxPassword.Text; }
        set { TextBoxPassword.Text = value; }
    }

    public void InformUserLogOnFailed()
    {
        MessageBox.Show("Invalid username or password.");
    }

    public void MoveToMainScreen()
    {
        // code for opening another form...
    }

    private Presenter presenter;
}

7
Bu, PassiveView adlı MVP varyantının bir uygulamasıdır. Pasif görünümde görünüm, sunum yapan kişiyi seçmemelidir. Benzer bir örnek için (ancak GERÇEKTEN pasif bir görünüme sahip) bu örneği kontrol edin danieleteti.it/?p=221 (Delphi dilinde örnek)
Daniele Teti

6

PureMVC'ye baktınız mı ? Belirli bir uygulama oluşturmaya başladıklarında MVC'nin gerçekte neye benzediğini kimsenin kabul edemediğini gördüm.

Güncelleme: MobileMVC gibi daha basit bir şeyle başlayarak kendinizinkini oluşturabilirsiniz . Compact Framework kodu Windows üzerinde derlemeli / çalıştırmalıdır. Bu bir okul ödevi olduğundan, MVC'nin gerçekte nasıl çalıştığını öğrenmek için biraz zaman ayırmanızı öneririm.


Bir kitapevini yönetmek için çok basit bir uygulama için bir okul ödevim var ve PureMVC gibi bir çerçeve kullanmak konusunda oldukça isteksizim. Daha basit bir şey arıyorum.
kjv


2

Windows Forms kullanarak kendi MVC uygulamanızı oluşturmanın iyi bir örneği burada bulunabilir . Kaynak kodu dahildir.

Bu ödev için kod okurken, çalışırken ve yazarken, MVC'nin nasıl uygulanması gerektiğine dair birçok anlaşmazlık olduğunu göreceksiniz. Bu, endişelerin ayrılığını yansıtan basit bir durum ve bunun yanı sıra bunu bağlamak için gerekli olan 'sıhhi tesisat'a iyi bir örnek.

Okul dışındayken muhtemelen diğer posterlerin önerdiği gibi bir çerçeveye geri dönmek isteyeceksiniz.


2

Microsoft Kompozit Arayüz Uygulama bloğu, hayatına bir MVC uygulaması olarak başladı (uyguladığı diğer modellerin yanı sıra). Bununla birlikte, yayın sürümü bir MVP uygulamasına dönüştü ve bu MVC konseptinin farklı bir yorumu olduğu söylenebilir.

Çok eksiksiz (ve bir şekilde karmaşık) bir MVP uygulamasının kodunu kontrol etmek istiyorsanız, MS-CAB'yi Microsoft Smart Client Software Factory'nin bileşenlerinden biri olarak bulabilirsiniz. Kaynak kodu ile birlikte gelir. Burada bulabilirsiniz . İyi şanslar!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.