2010-12-29 10 views
1

Ich habe ein Formular, das drei Elemente in einem Kombinationsfeld zeigt. Kontinente, Länder und StädteConstructor Abhängigkeitsinjektion mit Unity als IoC

Wenn ich ein Element z. wenn ich Cities auswähle und dann auf "Get Results" klicke, sende ich einen Select-Befehl über die Business- und Datenschicht an die Datenbank, die dann eine Liste vom Typ Cities abruft.

Die Liste wird dann an das Raster auf dem UI-Formular gebunden.

Die Klassen: Kontinente, Länder und Städte implementieren IEntities-Schnittstelle mit Eigenschaft Zeichenfolge "Name".

Die Schaltfläche Click-Ereignis ruft Business-Schicht mit:

click(object sender, EventArgs e) 
{ 
    string selectedItem = comboBox.SelectedItem; 
    IEntities entity = null; 
    List<IEntities> list = null; 

    if (selectedItem == "Cities") 
    { 
     entity = new Cities("City"); 
    } 

    if (selectedItem == "Continents") 
    { 
     entity = new Continents("Continents"); 
    } 

    if (selectedItem == "Countries") 
    { 
     entity = new Countries("Countries"); 
    } 

    //Then I call a method in Business Layer to return list 
    BL bl = new BL(entity); 
    list = bl.GetItems(); 
    myDataGrid.DataContext = list;//to bind grid to the list 
} 

Business Layer wie folgt aussieht:

public class BL 
{ 

    public IEntities _entity; 

    //constructor sets the variable 
    public BL(IEntity entity) 
    { 
     _entity = entity; 
    } 

    public IList<Entities> GetItems() 
    { 
     //call a method in data layer that communicates to the database 
     DL dl = new DL(); 
     return dl.CreateItemsFromDatabase(_entity.Name);//name decides which method to call 
    } 
} 

Ich möchte Unity als das IOC verwenden, um anstelle der Verwendung Fabrik (Art) pattern im Button click event mit if dann elses und mit hartcodierten Klassennamen möchte ich die Container-Konfiguration verwenden, die die relevante Klasseninstanz erzeugt. Und wenn die IEntities-Instanz an den Konstruktor der BL-Klasse übergeben wird, möchte ich das Objekt mit Unity übergeben. Können Sie mir bitte Ratschläge geben?

Antwort

1

Wie es existiert, ist dieses Design nicht gut geeignet, einen IoC-Container einzubauen.

Solange Ihr ComboBox noch enthält Strings, Sie gehen, dass gegen hartcodierte Werte in einer switch Aussage zu vergleichen, um zu haben oder einen Satz von if Blöcke irgendwo.

Darüber hinaus nimmt die Klasse BL einen Konstruktorparameter vom Typ IEntity, aber das kann zur Laufzeit ein Objekt von vielen verschiedenen Typen sein. Es gibt keine Möglichkeit, Unity beim Start zu konfigurieren, um BL zu instanziieren, ohne auch zu sagen, was als dieser Parameter zu verwenden ist (und wirklich nichts davon zu gewinnen).

Interessanterweise scheinen Sie jedoch diese Entity-Objekte zu dem einzigen Zweck zu instanziieren, ihren string-Namen an die CreateItemsFromDatabase-Methode zu übergeben; du verwendest seinen Typ nicht für irgendetwas. Es scheint, dass Sie den Konstruktorparameter ganz überspringen können und übergeben Sie einfach das ausgewählte string von der ComboBox direkt an die GetItems Methode und erreichen das gleiche Ergebnis. Wenn Sie einen anderen Grund dafür haben, sollten Sie den Namen im Konstruktor nicht angeben. Machen Sie es innerhalb jeder Klassendeklaration zu einem const.

Was könnte besser geeignet sein, GetItems eine generische Methode zu machen. Statt einen IEntity an den Konstruktor BL zu übergeben, würden Sie den konkreten Typ an die Methode übergeben:

var bl = new BL(); 
var countries = bl.GetItems<Countries>(); 
var cities = bl.GetItems<Cities>(); 
var continents = bl.GetItems<Continents>(); 
Verwandte Themen