Design n-tier - Nejlepší způsob, jak předat data načítání objekt

hlasů
1

Já používám základní konstrukci, 3-tier. Pro flexibility (a testovací) účely, chtěl jsem datovou vrstvu být abstraktní a určete třídu betonu v mém kódu. Ale jak by předám to spolu se svými obchodními objekty. Zde je příklad (pseudo kód):

abstract class IDataLayer
{
    PersonData GetPerson(int); //PersonData would be a row of data from a table for example
    JobData[] GetJobs(int);
    void UpdatePerson(PersonData);
}

class ConcreteDataLayerSQL : IDataLayer
{
...
}
class ConcreteDataLayerXML : IDataLayer
{
...
}

class PersonBAL
{
    void PersonBAL(personId)
    {
        //What goes here?
    }

    JobBAL[] GetJobs()
    {
       //What goes here?
    }
}
class Program
{
    static void Main()
    {
        person = new PersonBAL(1);
    }
}

Takže problém je, jak to PersonBAL vědět, které ConcreteDataLayer používat? Přemýšlím mezi několika možnostmi:

1: projít konkrétní datovou vrstvu k osobě. To se stává bolest při spuštění přidávání nových tříd, které potřebují komunikovat s datovou vrstvu (něco jako nový PersonBAL (IDataLayer, int), potom nový JobBAL (IDataLayer, int), atd atd)

2: Vytvoření statický objekt, který uchovává, které vrstva údaje použít (čti: globální proměnné)

Jakékoli další nápady?

Položena 27/08/2009 v 01:47
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

Problém se snažíte řešit je „závislost injekce“.

Za předpokladu, že je to .NET kód (váš pseudo-code jazyk vypadá hodně podobně jako C #), možná budete chtít podívat do rámce jako Spring.NET, který je určen pro tento druh věci.

Odpovězeno 27/08/2009 v 02:02
zdroj uživatelem

hlasů
0

byste mohli dát vrstvu indirection v kódu, takže si nikdy přímo zkonstruoval PersonBALmísto máte PersonBALFactory, které můžete použít k budovat své PersonBALinstance. Továrna má závislost na IDataLayer který prochází skrz konstruktoru (a že je zapojen v aplikaci spuštění čas) a řeknete továrnu k vytvoření člověka pomocí PersonId a to vytváří nový PersonBAL absolvování ID a IDataLayer. Tímto způsobem může uživatel nemusí dělat starosti s nimiž IDataLayer, který používáte, je nastaven v konfiguraci aplikace v době spuštění, uživatel prostě požaduje nové PersonBAL na základě informací, které znáte.

DI rámců vám pomůže nastavit všechny injekce závislost, takže správné typy jsou předány do konstruktérů a bude konfiguraci továrny (a věci, které mají závislost na závodech) Automatické a jednodušších až budete mít spoustu továren nebo komplexní grafy závislosti.

Odpovězeno 25/11/2010 v 12:24
zdroj uživatelem

hlasů
0

Myslím, že absolvování třídu v jednotlivých konstruktoru by bylo náročné z důvodů jste uvedli, a protože změna kódu použít jinou třídu by bylo náchylné k chybám fuška.

Závislost injekce je v jádru rámce Spring. Jarní používá konfigurační soubory XML k popisu vztahů mezi třídami. Pro váš případ použití, můžete určit konkrétní typ, který chcete vytvořit instanci v konfiguraci, takže budete muset provést pouze jednu změnu přejít implementace.

Jaro je známý a testovaný systém, ale samozřejmě nemusíte jej k vyřešení problému. Dalo by se velmi dobře psát si vlastní kód pro konfiguračních souborů. Ať tak či onak, je to v podstatě variace na druhou možnost jste zmínil.

Odpovězeno 27/08/2009 v 17:23
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more