除了MVVM以及WPF应用程序整体结构的MVC模式之外,您究竟如何将应用程序的模型/控制器方面分解为子组件?我问的原因是我从上面提到的模式的角度来构建解决方案没有问题,但是当涉及到实际编写后端时;我觉得我捏造了很多。从用户的角度来看,我最终得到了高质量的应用程序,但我的设计美学不允许我接受这一点。
澄清;我的许多业务逻辑无法以任何简单或有意义的方式重构为类(或类层次结构,具有所有相关接口),而无需更改整个应用程序。我现在已经专业发展了一年半,所以这可能是一个缺乏经验的问题;但我觉得它仍然没有任何借口。对此的任何指示都是公开的问题吗?
编辑:代码请求(在Silverlight中) - 以下是-snippet-来自拖放分配应用程序中的mousebuttonup处理程序,该应用程序是更大的应用程序的一部分 -
我真的不喜欢逻辑是多么直率,并且讨厌它完全无法实现的方式,因为所有东西都被塞进了事件处理程序。
//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);
}
}
答案 0 :(得分:5)
查看模式和实践组中的Composite Application Guidance。
它专门针对此,包括在大型应用程序中使用MVVM for WPF / Silverlight,以及如何处理业务逻辑问题等。
答案 1 :(得分:1)
您还应该检查Caliburn。