views:

329

answers:

2

Aside from the MVVM, as well as MVC patterns for the overall structure of a WPF app, how exactly do you break up the model/controller aspect of an app into subcomponents? The reason I ask is that I have no problem architecting the solution from the perspective of the patterns mentioned above, but when it comes to actually writing the backend; I feel that i'm fudging a lot of it. I end up with high quality apps from the user perspective, but my design asthetics don't allow me accept this.

To clarify; a lot of my business logic cannot be refactored into a class (or class hierarchy, with all associated interfaces) in any easy or meaningful way without having to change the entire app. I've been developing professionally for a year and a half now, so it may be an issue of inexperience; but I feel that it's still no excuse. Any pointers to this admittedly open ended question?

Edit: code request (in Silverlight)- The following is a -snippet- from a mousebuttonup handler in a drag-drop allocation application that's part of a much larger app-

I just really don't like how blunt the logic is, and hate the way that it's all completely unfactorable, since everything is getting stuffed into event handlers.

       //determine if there is a previously existing allocated sale corresponding to this purchase's ID

                SaleWS allocSaleExisting = colltoaddsale.FirstOrDefault(s => (s.p_TRADEID == allocPurch.TRADEID));


                if (allocSaleExisting != null && allocSale.TRADEID == allocSaleExisting.TRADEID)
                {
                    PurchaseWS allocPurchExisting = colltoadd.First(p => p.TRADEID == allocPurch.TRADEID);

                    //allocPurchExisting.AMOUNT += allocPurch.AMOUNT;
                    allocSaleExisting.AMOUNT += allocSale.AMOUNT;


                    allocPurchExisting.AMOUNT += allocSale.AMOUNT;
                    allocPurch.AMOUNT -= allocSale.AMOUNT;


                    colltoaddsale.Remove(allocSale);


                    //colltoadd.Remove(allocPurch);

                }

                else
                {


                    //Create new "split" item in the data source for the source table
                    PurchaseWS splitAllocPurch = new PurchaseWS { COMMODITY = allocPurch.COMMODITY, CONTRACTNUMBER = allocPurch.CONTRACTNUMBER, AMOUNT = allocPurch.AMOUNT - allocSale.AMOUNT, FORM = allocPurch.FORM, GRADE = allocPurch.GRADE, LOCATION = allocPurch.LOCATION, SHIP_DATE = allocPurch.SHIP_DATE, TRADEID = allocPurch.TRADEID, UNITS = allocPurch.UNITS };

                    //update the source table's selecteditem datacontext with the target allocation id

                    allocPurch.s_TRADEID = allocSale.TRADEID;

                    allocSale.p_TRADEID = allocPurch.TRADEID;

                    allocPurch.AMOUNT = allocSale.AMOUNT;




                    colltoadd.Insert(colltoadd.IndexOf(allocPurch) + 1, splitAllocPurch);







                }


            }
+2  A: 

Take a look at the Composite Application Guidance from the Patterns and Practices group.

It's geared specifically towards this, including using MVVM for WPF/Silverlight in large scale applications, and how to handle business logic concerns, etc.

Reed Copsey
+1  A: 

You should also check Caliburn.

gius