Domain ve Veritabanı Katmanlar Arası İletişim Kolu nasıl?

4 Cevap php

Ben iş mantığı (Domain) ve veritabanı erişim mantığı için ayrı katmanlar kullanarak için oldukça yeni, ama şeyler çalışma sırasında Ben hala büyük bir çözüm bulamadık hissetmek için bir sorun geldim.

Clarification Benim mevcut çözüm doğrudan veritabanı etkileşimleri ile başa çıkmak için Veri Mappers kullanır. Ben daha bu sorunu araştırdık Ancak, birçok kişi Domain katmanı ile doğrudan iletişim kurmak, ne de gerçekten veritabanı etkileşimi gerçekleştirmek Veri Mappers içermemesi gerektiğini düşündürmektedir. Ben Domain ve Veri gerekli Mappers arasındaki Deposu nesneleri yerleştirilir ancak bu oldukça doğal ya da doğru gelmiyor bu yüzden. Yani asıl soru doğal Domain ve Veri Mappers arasındaki iletişimi işlemek için var hangi katmanda olduğunu? Bunu nasıl yapılandırılacağını herhangi örnekleri mutluluk duyacağız.

Örneğin:

  • Nasıl düzgün bir başka etki alanı nesnesinin kapsamında etki alanı nesneleri bir koleksiyon alınırken ele?
  • Nasıl başka bir nesneye karşı gerçekleştirilen bir eylem dayalı nesnelerin tek bir etki alanı nesne veya koleksiyonu sokulmasını zorlamak yok. Ben şu anda karşı karşıya ediyorum durumda bir kişi bir Kampanya bağlı olduğunda, o zaman ben o Kampanya için o kişi için idam gereken Olaylar tüm eklemek gerekir olmasıdır.

4 Cevap

Gabriel, bu "impedance matching problem" olarak adlandırılır. Sadece bir el bağlantısı kodlama Ruby ActiveRecord J2EE varlık fasulye gibi ağır olanlardan pek çok çözümü vardır.

Update

Tamam, onun sert çok daha fazla bilgi olmadan bu saldırı tam olarak nasıl görmek, ancak burada temel yaklaşım için.

Mimari konularda bu tür herhangi bir performans gibi işlevsel olmayan gereksinimler tarafından tahrik edilir; Buna ek olarak, bir doğruluğu sorun emin güncellemeleri doğru sırayla yapılır yapmak istiyorum burada, orada. Yani, gerçek dünya uygulamasında kullanım desen söylemek için workload, düşünmek için ihtiyacımız olacak. Aklınızda ile, temelde sorunları bir çift var: Birincisi, uygulamanızda temel veri türleri veri tabanı (? Örneğin, ne bir VARCHAR özellik kodunuzda olarak temsil ediyor) doğru eşleme ve ikinci etki alanı modeli olmayabilir veritabanı modeline temiz haritasına olmayabilir.

Ne istiyorum bir etki alanı nesnesinin bir örneği tam olarak veritabanı modelinde bir tablodaki bir satır böylece veritabanı ve dmain modeli çalışmak zorunda olduğunu; büyük ölçekli uygulamalarda nedeniyle önceden varolan bir veritabanı modelinin dayattığı performans kısıtlamaları veya kısıtlamalar ya bunu nadiren yapabilirsiniz.

Eğer tamamen veritabanı modelini kontrol eğer o zaman veritabanı modeli daha yakından alanı benzer yapabilir çünkü Şimdi, bu, biraz şeyleri kolaylaştırır. Bu veritabanı modeli biraz denormalized anlamına gelebilir, ama eğer öyleyse, size (sizin veritabanı bağlı olarak) manzarasına sahip, ya da sadece tamamen normalleştirilmiş veritabanına sahip değil işlemek. Normalleştirme yararlı bir teorik yapı olduğunu, ama bu gerçek bir sistemde bunu sakin olamaz anlamına gelmez.

Eğer don't tamamen veritabanı modeli kontrol ederse, o zaman eşleme yapmak nesneleri bir katman gerekir. O uygulanmasında seçim seçenekleri bir sürü var: ikisi (yani birkaç adım var hatta sen ara nesneler oluşturabilir, veritabanında görüşlerini veya denormalized tablolar oluşturabilir, ya da her ikisi de bazı yapabilirsiniz, veya, Bir denormalizaed tablo erişen bir ara nesne.)

Bu noktada olsa da, siz "kendinizi tekrar etmeyin" ile sorunları çalıştırmak "muhtemelen çalışacak basit bir şey yapmak." Değiştirmek için büyük olasılıkla ne düşünüyorsunuz? Sizin etki alanı modeli? Güçlü bir etki alanı modeli var ise, bu iş değişiklikler nispeten nadiren --- az olasıdır. Veritabanındaki verilerin tam bir temsilidir? Biraz daha yaygın. Ya da, en yaygın, bunu düşünmek tam (eşzamanlı güncelleştirmeleri işlemek için bir ihtiyacı keşfetmek gibi.) Kullanım alışkanlıkları Peki, ne en yaygın değişiklikleri ile başa çıkmak için mümkün olduğunca kolay hale getirmek için yapmam gerekiyor.

Ben bu size çok kesin talimatlar vererek değil biliyoruz, ama biz senin uygulanırken karşılaşılacak hakkında bir sürü bilmeden kesin talimatlar sunabilir sanmıyorum. Zaten daha fazla veya daha az iş yapar şeyle çalışırken Ama sonra ben de tür, bu işleme "doğru" yolu ne olurdu merak ediyorsanız izlenim olsun. Yani, ben sorarak bitirmek istiyorum "sen şimdi mutsuz musun?" ve "Bunu nasıl çözmek istiyorsunuz?"

Bir etki alanı modeli ve bunun uygulanması arasında bir ayrım vardır. Senin modeli bir ilişki olduğunu göstermektedir sırf Person ---> Campaign ---> Event Bu şekilde uygulamak zorunda olduğu anlamına gelmez. IOW, modeliniz bir nesne yönelimli bir şekilde analizi ve tasarımı gösterir, ama sen o kodda bu modeli çoğaltmak ne kadar iyi sınırlıdır OOP'deki bu modeli uygulamak.

Aşağıdaki düşünün.

A Person bir Campaign kendi mülkiyeti ile tanımlanmış değildir, bu nedenle kampanya bilgisi responsibities dışında bırakılabilir. Öte yandan, bir Campaign, yürütme parçası olarak ortaya Event s tarafından tanımlanan, bu yüzden bir kampanya içinde olayların bir koleksiyona sahip adil olduğunu. Ben yapıyorum nokta her sınıf bunu bütün yapmak için yeterli davranış ve bilgiye sahip olmasıdır.

Etki ve kalıcılık katmanları arasındaki iletişim gibi, diğer ilgili değildir, iki çok farklı sistemler olarak onları düşünün. Hepsi her bilir onun sorumluluklarının ne olduğunu ve ne yapar duyuruları. Örneğin, sebat katman kendisine iletilen verileri kalıcı ve veri kaydedildi olduğunu duyurmak için nasıl bilir. Ancak, sebat katman mutlaka etki alanı nesneleri anlamak gerekmez. Benzer şekilde, etki alanı katman Person, Campaign anlar, ve Event ama kalıcılığı hakkında hiçbir şey bilmiyor.

Yukarıdakilerin dolaylı etki katman başına bir bütün olmasını ve veri sebat tabaka bağımlı olmamalı gerekiyor. Ancak, yine de kendi sorumluluklarını yerine veri ile birlikte gerekiyor. Bu veriler kullanıcı arabirimi veya veritabanı ya gelebilir ve etki alanı ve sebat katmanları hem de bilen bir üçüncü taraf aracılığı geçirilir.

Yani, kod (pseudo-C #) ...

namespace DomainLayer
{
    interface IDomainListener 
    {
        void PersonCreated(Person person);
    }

    class Person
    {
        private string name;

        public Person(string name)
        {
            this.name = name;
        }

        public string Name
        {
            get { return name; }
        }
    }

    class Domain 
    {
        private IDomainListener listener;

        public Domain(IDomainListener listener) {
            this.listener = listener;
        }

        public void CreatePerson(string name) {
            Person person = new Person(name);
            listener.PersonCreated(person);
        }
    }
}


namespace PersistenceLayer
{
    interface IPersistenceListener
    {
        void PersonDataSaved(int id, object data);
    }

    class Persistence
    {
        private IPersistenceListener listener;

        public Persistence(IPersistenceListener listener) 
        {
            this.listener = listener;
        }

        public void SaveData(object data)
        {
            int id = ...; // save data and return identifier
            listener.DataSaved(id, data);
        }
    }
}

namespace MyApplication
{
    class MyController : IDomainListener, IPersistenceListener
    {
        public void CreatePersonButton_Clicked()
        {
            Domain domain = new Domain(this);
            domain.CreatePerson(NameTextbox.Text);
        }

        public void PersonCreated(Person person)
        {
            Persistence persistence = new Persistence(this);
            persistence.SavePersonData(person.Name);
        }

        public void DataSaved(int id, object data)
        {
            // display data on UI
        }
    }   
}

Gördüğünüz gibi, ad alanları farklı katman temsil eder. XYZListener arayüzleri XYZ katmanı tarafından yapılan duyurular tanımlar. Bu duyurular ilgilenen ve onlara cevap verecek başka bir katmanda bizim MyApplication katmanlı yaptığı gibi, bu arayüzleri uygulamak gerekir.

"Yaratmak düğmesi" tıklandığında, kontrolör etki alanı katman için Domain cephe nesnesi oluşturur ve bir dinleyici olarak kendisini kaydeder. Daha sonra Person sonra bu yeni örneği ileterek, yapılması gerektiğini açıkladı başlatır CreatePerson yöntemini çağırır. Denetleyicisi sebat katmanın bir cephe çoğaltılır ve tekrar dinleyici olarak kendisini kaydeder PersonCreated Uygulamanın bu duyuruya yanıt verir. Daha sonra çağıran SaveData yöntem whichannounces DataSaved tamamlandığında. Bu yöntemin uygulama ardından UI üzerinde verileri görüntüler.

Gördüğünüz gibi, etki tabakası ve sebat katman Her sadece tmemselves farkındayız ve diğer sorumlulukları ile ilgili değildir. Bu kontrolörü olarak burada tecelli uygulama mantığı olduğunu, bu teller birbirine iki.

Geri belirli bir soruna, size duyurmak hangi, sebat bir yöntemi FindPerson olabilir PersonFound(int id). Kontrolör tarafından tepki daha sonra Person oluşturmak için bu verilerle etki katmanı diyoruz, kampanya ve olaylar hakkında veri almak için kalıcılık katmanı aramak olacaktır.

Uzun cevap için özür dilerim ...

Birçok sistemleri bir veritabanı gelen ve sebat işlemek için bağımsız bir veri katmanı kullanır. Böyle bir tabakanın organizasyonu için çeşitli modeller vardır. Bazıları etki sınıfta başına bir veri katmanı sınıf ile bire-bir eşleme istihdam, fabrika gibi uygulama bir tür kullanın.

Veri katmanı için model çoğu stil ve tercihinize bağlıdır. Önemli olan etki tabakadan kalıcılık katmanı ayıran. Bu yüzden özellikle PHP için herhangi bir isim olamaz ben bu katmanı oluşturmak yardımcı olacak orada araçları vardır inanıyorum, ama benim PHP bilgi incedir.

Ben PHPCake ve Symfony tarafından kullanılan veri soyutlama katmanları bakmak olacaktır.