<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://experience.fellowshipone.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Intelligent Design : MVC</title><link>http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/MVC/default.aspx</link><description>Tags &amp; Topics: MVC</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61120.2)</generator><item><title>Fellowship One APIs - Past, Present, and Future</title><link>http://experience.fellowshipone.com/blogs/intelligentdesign/archive/2009/02/25/fellowship-one-apis-past-present-and-future.aspx</link><pubDate>Wed, 25 Feb 2009 22:42:00 GMT</pubDate><guid isPermaLink="false">87eee960-b871-44cb-8a98-02588a960c04:13823</guid><dc:creator>FTProductDev</dc:creator><slash:comments>2</slash:comments><comments>http://experience.fellowshipone.com/blogs/intelligentdesign/comments/13823.aspx</comments><wfw:commentRss>http://experience.fellowshipone.com/blogs/intelligentdesign/commentrss.aspx?PostID=13823</wfw:commentRss><description>&lt;p&gt;With the up coming Fellowship One RESTful API we wanted to take the some time and look back on our other two APIs and reflect on what we intended them to be and what they actually became.&amp;nbsp; We looked at the their interfaces, authentication, resources, versioning, protocols, logging mechanisms, "debuggability", etc...&amp;nbsp; What we found out was that in the world of "API" nothing ever ends up like you intend.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:bold;"&gt;Fellowship One Data Exchange&lt;/span&gt;:&amp;nbsp; A very powerful XML &lt;a href="http://en.wikipedia.org/wiki/Remote_procedure_call"&gt;RPC API&lt;/a&gt; that was specifically designed to address massive data import and export needs.&amp;nbsp; It's ridged pinpoint interface allow users to build simple data presses, which move large amounts of data between disparate systems.&amp;nbsp; A few years into the product's life we introduced the ability to do synchronous transactions - a decision that completely changed many consumer's usage patterns.&lt;br&gt;&lt;br&gt;Serendipity
stepped in and instantly consumers began to use this brute force
application on websites to perform anything&amp;nbsp; from profile updates to
seamless login patterns.&amp;nbsp; After seeing how much the community found value in the login metaphor we've published docs and given presentations on the best practices of this approach. We now have 3rd parties writing web
applications and hosting web sites that do a myriad of things.&lt;/p&gt;&lt;p&gt;&amp;nbsp;Being a &lt;a href="http://en.wikipedia.org/wiki/SOAP"&gt;SOAP &lt;/a&gt;based .NET web service, consuming Data Exchange required the language to either have a library that constructs SOAP envelopes or that the developer understand that protocol and be able to construct a SOAP message manually.&lt;/p&gt;&lt;p&gt;Another characteristic of this API are the logging and response mechanisms; both were intended to only be used / interpreted by the consuming application.&amp;nbsp; Its authentication is based on simple credential / key maps.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;span style="font-weight:bold;"&gt;Fellowship One Payment Gateway&lt;/span&gt;: A .NET SOAP based web service that gives churches the ability to submit giving / e-commerce transactions.&amp;nbsp; The interesting thing about this service is that it was originally developed for internal consumption only and later opened up to external consumers for book stores, tithe applications, etc... another decision point that changed the way an established API was used.&lt;/p&gt;&lt;p&gt;Payment Gateway answered a changeling question of: "how do I get all of my billing and payments to go through one channel and be able to report on the transactions going through that channel?"&amp;nbsp; Much like Data Exchange, we saw it consumed in ways we couldn't have imagined.&lt;/p&gt;&lt;p&gt;We used credential and signed key authentication for this API.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;Fellowship One RESTful API:&lt;/b&gt; A REST based web application that uses several open protocols and patterns to provide consumers access to secure resources. &amp;nbsp;&lt;/p&gt;&lt;p&gt;STANDARDS, PROTOCOLS, and PATTERNS - nothing else.&amp;nbsp; Looking back, we could see where their is major value in sticking with something that is "tried and true."&amp;nbsp; If we could use &lt;u&gt;web based&lt;/u&gt; patterns and protocols for a &lt;u&gt;web based&lt;/u&gt; API we could not only get instant adoption but gain the efficiencies and effectiveness of technologies that "just work."&amp;nbsp; &lt;/p&gt;&lt;p&gt;This next generation of API is, ironically based on foundations that have been in place for years. &amp;nbsp; We chose &lt;a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller"&gt;MVC &lt;/a&gt;as the application architecture, &lt;a href="http://oauth.net/core/1.0/"&gt;OAUTH&lt;/a&gt; protocol for Authentication, &lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/rest_arch_style.htm"&gt;REST&lt;/a&gt; and &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html"&gt;HTTP 1.1&lt;/a&gt; as the transport.&amp;nbsp; This API should give web developers an tool where all they have to think about is what to do with the resources.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Thank you for partnering with us over the years; we have a lot of fun stuff up ahead and we hope to see you at the &lt;a href="http://www.dynamicchurchconference.com/developers"&gt;Dev track&lt;/a&gt; @ DC09!&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://experience.fellowshipone.com/aggbug.aspx?PostID=13823" width="1" height="1"&gt;</description><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/MVC/default.aspx">MVC</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/development/default.aspx">development</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/API/default.aspx">API</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/DataExchange/default.aspx">DataExchange</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/REST/default.aspx">REST</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/RESTful+API/default.aspx">RESTful API</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/Payment+Gateway/default.aspx">Payment Gateway</category></item><item><title>Innovating with MVC in ASP.NET</title><link>http://experience.fellowshipone.com/blogs/intelligentdesign/archive/2007/11/01/innovating-with-mvc-in-asp-net.aspx</link><pubDate>Thu, 01 Nov 2007 00:55:00 GMT</pubDate><guid isPermaLink="false">87eee960-b871-44cb-8a98-02588a960c04:8964</guid><dc:creator>FTProductDev</dc:creator><slash:comments>0</slash:comments><comments>http://experience.fellowshipone.com/blogs/intelligentdesign/comments/8964.aspx</comments><wfw:commentRss>http://experience.fellowshipone.com/blogs/intelligentdesign/commentrss.aspx?PostID=8964</wfw:commentRss><description>&lt;P&gt;If you were following our blog at the end of last year, you read my entry on MVC -&amp;nbsp;&lt;A class="" href="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/2006/09/22/Enterprise-.NET-architecture.aspx"&gt;Wrestling an Enterprise Architecture out of .NET&lt;/A&gt;.&amp;nbsp; Well, we pressed forward and developed a fully-working MVC2 architecture on top of ASP.NET.&amp;nbsp; We've had some bumps along the way, but we think it's been worth&amp;nbsp;the effort&amp;nbsp;to move to an MVC2 architecture.&amp;nbsp; The benefit of moving the majority of your application's logic into controllers cannot be overstated.&amp;nbsp; Testing and API extensibility are just a couple of the huge benefits.&amp;nbsp; We said as much to Scott Guthrie in an email conversation at the beginning of this year, and asked why Microsoft didn't address this architectural need.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;We were very pleased to hear that Microsoft is going to do just that with their &lt;A class="" href="http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx"&gt;MVC framework in ASP.NET&lt;/A&gt;, and it feels good to know we were ahead of the curve.&amp;nbsp; Matt Vasquez and I also had the honor of attending a Software Design Review of MVC and some other technologies, along with about 20 others, in Redmond last week.&amp;nbsp; It was a great event, with tons of info on upcoming technologies and some good conversations with the developers.&amp;nbsp; Not to mention the fact that a thirty second question to Scott Guthrie after dinner solved a problem that our development team has spent at least a collective 24 hours trying to figure out.&amp;nbsp; While everything covered in the SDR is under a non-disclosure, suffice it to say that we're excited about this new MVC support from Microsoft.&amp;nbsp;&amp;nbsp;Our home-grown architecture is very legitimized by what we saw.&amp;nbsp; We're very close to what they've developed, but I'm sure we'll be able to use a lot of what they're creating to more cleanly handle what we had to hack onto ASP.NET.&amp;nbsp; It's also exciting to be able to influence the development of this new framework.&amp;nbsp; I plan on cranking some code from the SDR bits starting this weekend and giving lots of juicy feedback.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;I pray that all our customers know that we place a great deal of importance on innovation.&amp;nbsp; It's a high priority for us to innovate both&amp;nbsp;our architecture and our processes to improve our product, and we aren't afraid to go to the lengths necessary to align our development with future-thinking choices.&amp;nbsp; It takes a pioneering spirit to not only see where technology needs to go, but to also take the effort/time/risk to move in that direction.&amp;nbsp; This past year, we moved to the Agile process of &lt;A class="" href="http://en.wikipedia.org/wiki/Scrum_(development)"&gt;Scrum&lt;/A&gt; and created our own MVC architecture on top of ASP.NET.&amp;nbsp; All of our new development now adhears to the MVC pattern (MVC2 if you want to be specific).&amp;nbsp; God has given us a pioneering spirit, and we're excited about where He's leading us.&lt;/P&gt;
&lt;P&gt;thardy&lt;/P&gt;&lt;img src="http://experience.fellowshipone.com/aggbug.aspx?PostID=8964" width="1" height="1"&gt;</description><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/MVC/default.aspx">MVC</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/Framework/default.aspx">Framework</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/Scrum/default.aspx">Scrum</category></item><item><title>Wrestling an Enterprise Architecture out of .NET</title><link>http://experience.fellowshipone.com/blogs/intelligentdesign/archive/2006/09/22/Enterprise-.NET-architecture.aspx</link><pubDate>Fri, 22 Sep 2006 23:24:00 GMT</pubDate><guid isPermaLink="false">87eee960-b871-44cb-8a98-02588a960c04:219</guid><dc:creator>thardy</dc:creator><slash:comments>3</slash:comments><comments>http://experience.fellowshipone.com/blogs/intelligentdesign/comments/219.aspx</comments><wfw:commentRss>http://experience.fellowshipone.com/blogs/intelligentdesign/commentrss.aspx?PostID=219</wfw:commentRss><description>&lt;p&gt;As a growing &amp;quot;Software as a Service&amp;quot; (SaaS) development shop using .NET we&amp;#39;ve encountered many growing pains and some of the speed bumps inherent in&amp;nbsp;the architecture that many others probably have as well.&amp;nbsp;&amp;nbsp;I&amp;#39;d like to express some of the issues we&amp;#39;ve encountered and hear if anyone else would like to start a dialog on the shortcomings and potential solutions to scaling enterprise .NET development.&amp;nbsp; &lt;/p&gt;&lt;h3&gt;The bigger the code, the bigger the problems&amp;nbsp;&lt;/h3&gt;&lt;p&gt;The typical architectures espoused by .NET aren&amp;#39;t well-designed for large, &amp;quot;always-on&amp;quot;&amp;nbsp;apps.&amp;nbsp;&amp;nbsp;This has become clear to us as our development group and our codebase have grown.&amp;nbsp; SaaS is a big factor here as well, since best-practice is quickly discovered to be a rather tight, incremental release schedule.&amp;nbsp; As our development group scales, and feature demands increase, the framework everything is written in begins to show its strengths and weaknesses.&amp;nbsp; It&amp;#39;s the sort of thing that is difficult to see until many hands have been in the same pot over a period of years.&amp;nbsp; J2EE seems much more geared towards large, enterprise apps, with more emphasis on strict contracts and black boxes.&amp;nbsp;&amp;nbsp;While many of the Java frameworks seem like overkill to most .NET developers, it&amp;#39;s because most .NET developers don&amp;#39;t work on the same codebase for more than a year or two.&amp;nbsp; It seems like Microsoft has made a calculated move to aim squarely between the enterprise and the PHP-type developer&amp;nbsp;communities.&amp;nbsp; We love .NET tools though, and are looking at some foundational architecture changes to tackle these issues.&lt;/p&gt;&lt;h3&gt;Misplaced intelligence&amp;nbsp;&lt;/h3&gt;&lt;p&gt;One of the key difficulties introduced with .NET is the Page-Controller Pattern.&amp;nbsp; Despite how nice and elegant the most common n-Tier .NET architecture sounds on paper, practice shows that a great deal of intelligence (WAY TOO MUCH intelligence) inherently ends up in the code-behind of your pages and user controls, and thus, smack in the middle of your presentation layer.&amp;nbsp; This produces a tight coupling between the presentation and business layers and a lot of business logic in the wrong place.&amp;nbsp;&amp;nbsp;The commonly espoused reason for decreasing this coupling is the ability to completely change the UI layer - say, to take your existing business layer that you used with your Web pages and slap WinForms directly on top of it.&amp;nbsp; While this would be wonderful, the more pressing reason is the simple need to refactor code for maintainability and extensibility.&amp;nbsp; Anything in your code behind pages cannot be reused elsewhere.&amp;nbsp; While having nice business methods in your business layer like &amp;quot;FetchOrdersByCustomer&amp;quot;, or &amp;quot;UpdateProducts&amp;quot; that deal with&amp;nbsp;nice typed objects and collections may make you feel all warm and fuzzy because you have your n-tier bases covered, your architecture bases really aren&amp;#39;t covered at all.&amp;nbsp; Or maybe you have your entities possess the intelligence to manipulate themselves.&amp;nbsp; Either way, the majority of custom development occurs within the consumers of these methods.&amp;nbsp;&amp;nbsp;If the consumers of these methods are in your code behind, you will have real problems as your product grows, your development team grows, and the demands on your product begin to pull it in multiple directions.&amp;nbsp; What you really want is an incredibly stupid presentation layer that only has intelligence about itself.&amp;nbsp; It should only know how to present information from a strictly contracted model it knows nothing about manipulating, how to manage state between &amp;quot;locations&amp;quot; (pages, winforms, pocketPC forms, etc), and how to handle client-side behavior.&amp;nbsp; This is another argument for stupid entities as well (our entities do not know how to manipulate themselves), since our presentation layer can reference our entities without having to worry about exposing all that business logic to the presentation layer.&amp;nbsp; I&amp;#39;m sure I&amp;#39;ll get some disagreements on that, but that&amp;#39;s the beauty of hearing other people&amp;#39;s opinions.&lt;/p&gt;&lt;h3&gt;A possible solution&lt;/h3&gt;&lt;p&gt;The solution we are developing is moving towards something closer to the Model View Controller pattern.&amp;nbsp; Particularly MVC2, which is the same pattern altered for the web.&amp;nbsp; Microsoft&amp;#39;s User Interface Application Block is an MVC block, but MVC does not work on the web.&amp;nbsp; MVC depends on the View being directly updatable from changes to the model, so that combined with the complexity of that application block make it unfeasable for our use.&amp;nbsp; Since the web is stateless, there is no way to directly update your UI from changes to the model.&amp;nbsp; What MVC2 does is simply insert the controller into the process coming from both directions (web to model, and model to web).&amp;nbsp; Microsoft has no packaged solution for anything close to MVC2, which is really disappointing, since you would think they&amp;#39;d want to compete more directly with J2EE and fill this gaping architectural hole.&amp;nbsp; There are some packaged solutions from third parties (even more evidence of a serious development need unmet by Microsoft), such as Maverick.NET &lt;a href="http://mavnet.sourceforge.net/"&gt;http://mavnet.sourceforge.net/&lt;/a&gt;, MonoRail &lt;a href="http://www.castleproject.org/index.php/MonoRail"&gt;http://www.castleproject.org/index.php/MonoRail&lt;/a&gt;,&amp;nbsp;and&amp;nbsp;something called NWAF &lt;a href="http://sourceforge.net/projects/nwaf"&gt;http://sourceforge.net/projects/nwaf&lt;/a&gt;, but all of the above&amp;nbsp;take rather radical departures from the .NET way of doing things and are a big jump for .NET developers.&amp;nbsp; Things like the basic page lifecycle and ViewState are radically changed.&amp;nbsp; We wanted something that wasn&amp;#39;t quite a big leap for our group, yet still gave the major benefits of MVC2.&amp;nbsp; &lt;/p&gt;&lt;p&gt;There has been a pattern that has recently risen to the top of the .NET pattern circles called Model View Presenter (MVP) that attempts to take a stab at MVC2 and still maintain WebForms and ViewState management.&amp;nbsp; I&amp;#39;ve recently read a few articles that mention Microsoft&amp;#39;s CAB (Component UI Application Block) will have some MVP patterns in it, but we&amp;#39;re not holding our breath.&amp;nbsp; It&amp;#39;s also targeted at Smart Clients, so I don&amp;#39;t know how practical it is for pure web-based apps.&lt;/p&gt;&lt;p&gt;We&amp;#39;re building our own home-grown version of an MVP architecture for all development going forward.&amp;nbsp;We are also baking in&amp;nbsp;a few more things that we feel are important, such as:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Typed navigation - urls should never appear in code, and it would be nice if the developer knew the exact state data required in order to navigate to that location/view at compile time&lt;/li&gt;&lt;li&gt;Removing all state-management concerns from the Controller layer - controllers should not care anything about how state is persisted or even have to make the decision that something should be persisted.&amp;nbsp; They should just be able to expect the properties on the View to be available.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;As we get further along, I&amp;#39;ll post some of the pitfalls and breakthroughs we come across.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://experience.fellowshipone.com/aggbug.aspx?PostID=219" width="1" height="1"&gt;</description><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/View/default.aspx">View</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/MVC2/default.aspx">MVC2</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/MVP/default.aspx">MVP</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/Model/default.aspx">Model</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/Controller/default.aspx">Controller</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/MVC/default.aspx">MVC</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/Presenter/default.aspx">Presenter</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://experience.fellowshipone.com/blogs/intelligentdesign/archive/tags/.NET/default.aspx">.NET</category></item></channel></rss>