Laden...

Composite UI Application Block (CAB) wie geht das?

Erstellt von thomasstoll vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.582 Views
T
thomasstoll Themenstarter:in
9 Beiträge seit 2006
vor 16 Jahren
Composite UI Application Block (CAB) wie geht das?

?( Hallo,

ich muss eine Anwendung schreiben in der ich auf eine Access-Datenbank zugreife und dies über unterschiedliche ansichten auf die Daten. Je nach Anwender hat man eine unterschiedliche Sichtweise auf die Daten. Außerdem kommt mein Boss auf immer neu Anwendungsmöglichkeiten der Datenbank.
Wie ich hier im Forum erfahren habe, ist „Composite UI Application Block“ das richtige für meinen Fall. Leider hatte ich vorher noch nie etwas damit zu tun. Jetzt fehlt mir ein EINFACHER einstieg in die Materie.
Ich habe schon einige kleine versuche gemacht, komme aber nicht so recht weiter.

Was ich mich Frage ist:
Warum muss ich meine Module in mehrere Teile zerpflügen. Das mit dem WorkItem und dem View ist mir noch einleuchtend, wofür brauche ich aber noch ein ControllerItem? So muss ich ja immer extrem umständlich jede Benutzeraktion vom View über Controller zum WorkItem durchschleusen?
Beim Controller habe ich dann auch das größte Problem. Ich schaffe es nicht den Controller im View zu Insantieren. Das folgende habe ich aus einem Beispiel abgeschrieben, die „button1_Click” Methode habe ich dann hinzugefügt. Was ich nicht verstehe, ist dass „controller“ bei mir immer „null“ ist. In der Anwendung, aus der ich das Abgeschrieben habe, funktioniert die sache. An welcher stelle muss ich „controller“ einen wert zuweisen?

 
//View
namespace PSDBOverview
{
    [SmartPart]
    public partial class PSDBOverviewView : UserControl
    {
        private PSDBOverviewController controller;

        public PSDBOverviewView()
        {
            InitializeComponent();
        }

        [CreateNew]
        public PSDBOverviewController Controller
        {
            set { controller = value; }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            controller.TestBtn();
        }
   }
}



//Controller
namespace PSDBOverview
{
    public class PSDBOverviewController : Controller
    {
        public PSDBOverviewWorkItem PSDBOverviewWorkItem
        {
            get { return base.WorkItem as PSDBOverviewWorkItem; }
        }

        public void TestBtn()
        {
            PSDBOverviewWorkItem.TestBtn();
        }
    }
}




//WorkItem
namespace PSDBOverview
{
    public class PSDBOverviewWorkItem : WorkItem
    {

        ISmartPartInfo smartPartInfo;
        PSDBOverviewView psDBOverviewView;

        [EventPublication("event://UpdatesAvailable", PublicationScope.Global)]
        public event EventHandler<DataEventArgs<string>> UpdatesAvailable;

        public void Run(IWorkspace TabWorkspace)
        {
            smartPartInfo = new SmartPartInfo();
            smartPartInfo.Title = "Übersicht";
            smartPartInfo.Description = "Übersicht über alle Projekte";
            psDBOverviewView = new PSDBOverviewView();
            TabWorkspace.Show(psDBOverviewView, smartPartInfo);

            this.Activate();
        }

        public void TestBtn()
        {
            newUpdatesAvailable("Testbutton");
        }

        public void newUpdatesAvailable(string customerId)
        {
            if (UpdatesAvailable != null)
            {
                UpdatesAvailable(this, new DataEventArgs<string>(customerId));
            }
        }
    }
}


Die nächste Frage ist, warum muss ich das so umständlich machen. Wenn einer einen Button auf der Oberfläche drückt, dann ruft das Button_Event die „TestBtn“ Methode vom Contoller auf und die wieder die „TestBtn“ Methode des WorkItems und diese Feuert dann das eigentliche Ereignis. Ich habe schon versucht das Ereignis direkt aus dem View auszulösen, das hat aber nicht geklappt. Das geht scheinbar nur von dem WorkIetem aus. Scheinbar ist es auch nicht möglich vom View aus direkt auf das WorkItem zuzugreifen.

Ich habe bisher kein einziges Beispiel gefunden das meinen Anwendungsfall beschreibt (oder ich hab es nicht verstanden). Ich würde meine Anwendung gerne so gestalten, dass ich ein Hauptanwendung habe und mehrere Module für verschieden Aufgaben. Die Anwendung sollte auch durch Plugins erweiterbar sein.
Für ein paar LEICHT zu verstehene hinweise wäre ich äuserst Dankbar!!

Bitte Entschuldigt, aber es könnte sein das ich hier eine menge Denkfehler gemacht habe, aber ich bin was CAB angeht, absoluter Anfänger (ich habe erst vor 2 Tagen zum ersten mal davon gehört).

1.274 Beiträge seit 2005
vor 16 Jahren

Das mit dem CAB ist hat am Anfang eine hohe Lernkurve.
Da das ganze mittels Pattern funktioniert solltest du dir die mal ansehen, vor allem das MVC Pattern.

Was dein Einstieg erleichtert ist das Hands-On Lab von Microsoft.

Und wenn du das ganze mittels ein bisschen Automatismus (aber erst nachdem du CAB verstanden hast) vereinfachen möchtest gibt es da von Microsoft Pattern & Practices eine Smart Client Software Factory.

lg.
LastGentleman

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

F
10.010 Beiträge seit 2004
vor 16 Jahren

Bitte schau Dir SCSF an ( www.codeplex.com/smartclient ), das vereinfacht die
erstellung ungemein.

2.
Man kann auch Spagettiecode produzieren, ist aber dann nicht wartbar.
Die Trennung View/Controller/Presenter wird Dir erst bewusst, wenn Du mal
SW Architektur verstehst.
Lese dazu mal etwas zu den begriffen wie MVC und MVP.

3.
Natürlich musst Du das nicht ganz so machen.
Aber die Trennung zwischen view und Controller/Presenter muss sein.
Nur warum du das event im Workitem wirfst ist mir ein rätsel, das kannst Du auch
im Controller machen.

Grundsätzlich gilt, der Controller verarbeitet/steuert den aktuellen Businessfall,
der View bietet lediglich die visuelle entsprechung.
Damit kann man durch austausch des View z.B. eine WPF/ASP Anwendung erzeugen,
ohne die BL zu ändern.

T
thomasstoll Themenstarter:in
9 Beiträge seit 2006
vor 16 Jahren

Hallo,

danke für die schnellen Antworten.
Ich habe mir mal die Microsoft Pattern & Practices eine Smart Client Software Factory heruntergeladen und ein bisschen rumexperimentiert.
Ich muss sagen, das ganze ERSCHLÄGT meine Anwendung. Das ist mit Atombomben auf Spatzen geschossen. Da hat Rainbird auch in meinem fall recht, in seinem Post, in http://www.mycsharp.de/wbb2/thread.php?threadid=35290&hilight=addin+eigene+anwendung.
Es ist möglich, das es auch eine leichte Variante davon gibt, aber das wird nirgendwo erwähnt (oder ich hab’s noch nicht gelesen). Leider habe ich für meine geplante Anwendung nicht die Zeit die Riesige Dokumentation durchzulesen (und vor allem dann auch zu Verstehen).
Ich brauche nur eine Anwendung die sich leicht erweitern läst, keine „allumfassende Superkonzern für alles Anwendung“.
Ich bin dem ganzen nicht abgeneigt, doch ist es mir nicht möglich, in der mir vorgegebenen Zeit, das Programm in dieser weise umzusetzen.
Die Programmierung mache ich nicht Hauptberuflich, mein Chef hat nur herausgefunden das ich mich mit der Materie einigermaßen gut auskenne. Die Anwendung soll unsere tägliche Arbeit ein wenig erleichtern, mich aber nicht davon abhalten (wobei ich die Vesuche in den letzten Tagen schon in meiner Freizeit gemacht habe und während meiner Arbeitszeit mein altes Konzept weiter geführt hab). Da uns und besonders meinem Chef immer mal was neues einfällt, wäre eine Erweiterbarkeit nicht schlecht. Vielleicht kennt ja jemand etwas mit dem eine einfache Plugin- Lösung möglich ist.

Ich verstehe durchaus SW Architektur und auch die Notwendigkeit der Trennung vom UI und dem Rest der Datenverwaltung. Ich finde es aber übertrieben wenn man bei einer ganz einfachen Anwendung über 3 oder 4 Ebenen gehen muss. Ich habe keinen Layer der die Handlung voran treiben muss, wie bei einem Spiel. Ich habe nur ein Oberfläche mit der, der Anwender interagiert und einige Reaktionen darauf.
Wie gesagt ich suche eine EINFACHE Plugin/Addin- Lösung. Vielleicht kennt ja jemand sowas!

F
10.010 Beiträge seit 2004
vor 16 Jahren

Du hast es wieder falsch verstanden.

Du muisst die SCSF nicht verstehen, es reicht diese Anzuwenden.
Das sind ein Haufen generatoren, die Dir beim erstellen der SW tatkräftig
unter die Arme greifen.

Du willst eine neue SCSF Anwendung? Unter neue Projekte gibt es eine Vorlage.

Du brauchst ein neues Modul? Rechtsklick im Projektexplorer, schon hast Du ein
komplettes Modul generieren lassen, incl. automatischem einfügen in den Profilcatalog.

Du brauchst einen neuen View, rechtsclick und gut.

Das ist der Sinn für entwickler der SCSF, Architekten können sich da erst recht austoben.

Und zur Trennung, wie schon gesagt, Trennung View/Presenter ist OK, mehr brauchst Du nicht.

Hast Du globale Funktionalitäten ( z.B. DAL ) ist das predestiniert für einen Service.
Das jkannst Du dann aber irgendwann machen.

Wenn Du das alles nicht haben willst, bei Codeproject.com gibt es einen kleinen
MDI einstieg in CAB, ganz ohne den rest.

K
20 Beiträge seit 2006
vor 16 Jahren

Gibt es eigentlich die Moeglichkeit die Dockpanel Suite von Weifen Luo im CAB einzubinden?

http://sourceforge.net/projects/dockpanelsuite/

Krischan100

F
10.010 Beiträge seit 2004
vor 16 Jahren

Klar gibt es die möglichkeit, ist aber nicht ohne.

Auf codeproject.com gibt es ein Beispiel, wo das jemand für die Dockingcontrols
von Sanddock gemacht hat.

Und auf gotdotnet ( das läuft aber aus ), hat es jemand für devExpress implementiert.

K
20 Beiträge seit 2006
vor 16 Jahren

Hast Du eventuell auch Links dazu? Habe bei Codeproject gesucht und nichts gefunden🙁 .

Krischan100

726 Beiträge seit 2003
vor 16 Jahren

einfach nur "CAB" bei cp eingeben ,)

http://www.codeproject.com/gen/design/CABMDI.asp

http://www.codeproject.com/useritems/DockableCabWorkspaces.asp

speziell der 2te Link dürfte dich interessieren