Compare between 3-Layer pattern and MVVM - c#

I don't know MVVM. I always follow 3-layer patter where one layer is UI, another layer is Business layer and last layer is Data access layer.
In this layer we send request from UI to Business layer and Business layer interact with data access layer. In this pattern, everything goes fine then my question why should one learn MVVM. What is the advantage of MVVM. What are the things can be done very little effort using MVVP. Please discuss in detail. Thanks.

The Layers
As opposed to what ppl wrote before me - the MVVM pattern is not about splitting the UI Layer into 3 layers, it's about splitting the UI Layer into two additional layers - The View and ViewModel.
so if we had DAL, BLL, and UI, now we have Model(DAL & BLL) and ViewModel + View (instead of just one layer UI).
it's still 3 layers but orchestrated differently (and if you really think about it - DAL was never really a layer - it's a helper class at most, so the aforementioned 3-layer was in actuality just 2 layers, that are now becoming 3 layers in MVVM).
The Reasons
if you think about it, you'll see that in 3 layers architecture, usually the UI is mixed with presentation code, and application logic code. this violates SRP (Single Responsibility Principle) and is bad for several reasons.
in MVVM the UI Layer is separated into two layers. the ViewModel, which is in charge of the Application Logic, and the View, which is in charge solely on presentations.
This allows you three very important things:
better code Maintainability.
easier to work with VS designer and Blend. aka Blendability. (this is arguably the strongest feature of MVVM. It really boosts up productivity)
allows for testing of the ViewModel with automated tests, whereas up until now we had to test the UI itself, and doing automated tests on UI is complex. This is called Testability
on a personal note; I've been writing in n-tier architecture for years. I started practising MVVM a little over a year ago. It could be a rough ride in some times, but man, it's really worth the effort.

MVVM is for building the UI layer. It is a pattern that enables a very nice interaction between your business objects and the UI-framework. You don't have to change your 3-Tier pattern. MVVM is on another abstraction level.
Here you find a very good video introducing MVVM and probably answering a lot of questions.

MVVM is arguably a three layer architecture itself. Those layers all exist within the same application.
"3-layer" also sometimes refers to n-tier architecture, which is more about separating the UI, the service layer, and the data layer, onto separate servers. If you have that sort of layering, then MVVM will not replace it. It will only augment the UI layer, splitting it into its own three layers.
Here's a write-up of MVVM that shows some relation between classic MVC, through MVP and MVVM:
http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
Also see my answer to this other question. It explains some of the reason you would use MVVM over older variations on MVC.

MVVM is specifically relevant to WPF, Silverlight/Moonlight and Windows Phone 7 because it takes advantage of the powerful databinding that is built into these frameworks.

Related

What extra layers can there in n-layer architecture for an application?

i studying on software architecture principles.
i understood that what is three layer architecture (contains Presentation-Business -Data Access).
but anybody has any idea or extra layers for doing it for example someone do it by extra layers such as 'Service' layer 'Infrastructure' layer or other layers etc.
are there any extra layers for doing it?
I'm confused about doing it.
please help me ...
C# is no different from other (imperative) programming languages. Your exact architecture is often dictated by the framework in use. If you are using C#, it's likely some flavor of ASP.NET MVC. This is a good overview.
Often, between the model and controller a service layer is introduced to encapsulate some business logic and transaction flows. Whether this layer is "correct" or not is a matter of quite a bit of debate, and generally depends on whether you subscribe to the DDD camp or not. Realistically, if you have lots of complex business logic, externalizing the logic into a service layer increases the testability, at the cost of decreasing the real-world modeling ability of your model layer. For pragmatic, testing purposes, the service layer often ends up being the source of most of your business logic.
Repository or Data-Access layers are separated from model layer, and are very useful if your domain persistence hits a certain level of complexity. I usually end up creating them by default as it also helps with testing to decouple the model from their persistence (and allows easy injection of mocks).
A Common tiered architecture makeup:
Core Layer
Infrastructure
Presentation
Broken down even further, these 3 layers can have their own granular layers.
Core Layer
Domain Models
Enums
Infrastructure
Repositories
Data Transfer Object Models
Services
Unit of Work
Presentation
MVC Project
Web API
I guess to answer you question, I could throw a layer in between the infrastructure and presentation layer and have a Testing layer. Just keep in mind that by layering the application architecture like this by using the file structure is really only beneficial if you follow SOC and SOLID principles in your code.

approaches to organise event handling with increasing software complexity

I am trying to use the Model View Presenter (MVP) pattern for a software that I am writing. I am using C# and Windows Forms, althought that should not matter for answering my question.
I have multiple "MVP-structures". One, for example, is handling retained mode graphics where I can draw geometric shapes on a canvas. Another one is taking these shapes, doing some analysis on them and putting the result somewhere else. There are potentially many events that cause controllers to manipulate data somewhere which then causes cascading manipulation of data in yet another place and so forth.
My fear is that I will eventually loose track of what is changing what if I do not organise my software properly. I can think of two ways to organise the interactions between programm parts occuring in my software: either hierarchical or switch board-like.
My question is: Are there any well known approaches or patterns, that I should look up to organise my software? I would need a starting point for my web search.
I think your intuition is right. If you create many events that cascade you are going to end in trouble. I've seen many times over-complex applications due to out of control eventing. This makes the code very difficult to debug and improve.
First thing it came to my mind was the mediator pattern. Elaborating a bit more I would have central classes that manage parts of the business logic. I would have the model in each of the MVP lightweight , basically being a client that asks the server (one of this controller classes) for more complicated business logic. The idea is to have every model of the MVP classes interacting with as few classes as possible (core business logic) and avoid interacting with other MVPs (which will have more specific business logic)
In any case I would limit as much as possible the classes that throw and listen to events and would centralize this in as few places as possible. The observer pattern can help here. Also having a client-server architecture with a service layer containing the heavy business logic can help making this decoupled and maintanable in the future.
The pattern service layer from the fowler classic "patterns of enterprise application architecture" could be good reading too.

C# What Layer to start with

Ok 2 questions here.
I am creating a c# application from a vb6 application. I will be using a business logic layer, a data layer, presentation layer, and data layer.
What layer should I start with since the database is already in place?
2nd question. If I code a new app would I start with this same layer?
Which layer to start with is a hard thing to talk about abstractly. It does vary depending on what type of application you are discussing, the size of said application, and the general interdependencies.
If I understand your question correctly it sounds like you are considering writing (say) the entire data layer before moving on to the business layer.
Why start with any one layer? If you writing an application (either from scratch or as a port of an existing app) then why wouldn't you divide that app up into stories and tackel it in more of a feature oriented fashion?
By doing this you will have parts of a functional app that you can prototype with much quicker. This will also allow you to spot design problems in all layers much quicker, as you are not only writing the layers but also consuming them.
I generally prefer starting with the UI. The UI is the point of customer interaction, and so drives the requirements for the rest of the layers.
In some cases, there's some core bit of logic that's really key, and it's a good idea to start there. But generally, I find the UI is the best place to start.

How many layers is too many?

As I have been learning about software development the last 2 years the more I learn, it seems the more gray areas I am running into. One gray area I have issues with right now is trying to decide how many layers an application should have. For example, in a WPF MVVM application what fashion of layering is ok? Is the following too separated? When I mention layering I mean creating a new class library for each layer.
Presentation (View)
View Model
Business Layer
Data Access
Model Layer
Utility Layer
Or for a non MVVM application is this too separated?
Presenation
Business
Data Access
Model Layer
Utility Layer
Is acceptable to run layers together and just create folders for each layer? Any coloring of this gray area would be appreciated.
The answer is, it depends. First off, a separate class library doesn't always mean a separate "layer." A layer is a conceptual grouping of related functionality, that may or may not manifest itself in a single assembly.
How many layers you create is really dependent on your problem at hand. Traditionally, a WPF MVVM application will contain at least the 3 layers (Model, View, View Model) but it can really be varied. Often times I see the Views and ViewModels in the same assembly and the models in their own assembly (usually because the Model objects are POCO's that are used in other contexts)
There is really no silver bullet that answers your question, it is entirely dependent on your problem. The advantage of "layering" and separation is to increase maintainability, promote code re-use, and increase overall clarity (to name a few).
I would argue that if you are not reaching these goals with your current layering solution then you have room to improve. If increasing the layers is decreasing the clarity or maintainability then you have gone too far. If you have only a single "layer" and it is becoming bloated then you have an opportunity to add a layer.
The bottom line is don't over engineer something for the sake of following a strict "pattern." If the pattern has clear advantages to you and your problem at hand then implement it, but understand why you are doing so and what the goal of each "layer" is.
Consider the following areas:
Speed
Reusability
Readability
Development time
Modification speed (the right words to describe this point are escaping me. Edit - Maintainability was what I was looking for [stolen from someone elses answer])
Application footprint (scale and literal size)
Your development team
...then adjust your architecture based on which of these you value. I'm probably missing some other important parts, but you get the idea. There's really no right or wrong answer to this.
An application only has too many layers if the layers themselves become a hurdle to the maintainability of the project as opposed to improving maintainability.
The exact number of layers that is too many is 1 more than is needed.
Layered Architecture: This article describes a concrete example architecture for .NET/WPF Rich Client Applications. Furthermore, the architecture shows in which layer you find the participants of the Model-View-ViewModel (MVVM) pattern.

Convert an ASP.NET application to a Silverlight application

I'm developing an three layer ASP.NET application with C# and Visual Studio 2008 SP1. I'm using WebForms.
I'm wondering to convert that application to a Silverlight application. Maybe I can reuse a lot of code of ASP.NET layer.
What do you think about?
Assuming you have the typical presentation, business logic, and data layers, and also assuming that you have separated your code diligently into these layers, you should be able to replace your Web Forms with a Silverlight interface and leave your BL and DAL intact.
Real projects tend to be somewhat messy, however, making such a transition more difficult. If you're using SqlDataSource you might have problems.
Those are some good points #Andy, and to expand on what he said:
i'm doing that very same thing right now. Because i have a rather comprehensive business layer, i have been able to do a lot of work (a couple of weeks worth), and in that time i have only had to add one function to that business layer. This is important because it reduces the amount of testing required. It also makes any remaining testing easier as it is easier to compare the output of the old version of the application with the new version.
One pattern that really helped to achieve this was the facade pattern. I built a WCF layer that sits over top of the business layer, and by using the facade pattern i can return results that are more suitable for the new silverlight interface, without interfering with the business layer.
It is most likely though that your new UI will have a drastically different architecture than the ASP.NET version. You will be able to achieve a far cleaner separation between UI, code and data. Some of the ASP.NET code that i was quite proud of looks positively mangy next to the equivalent silverlight code. Be prepared to chop your old code up, and eliminate those business rules from the immediate code behind :)
If you're goal is simply to replicate the UI behaviour as delivered by ASP.NET then yes assuming good partitioning you could re-use quite a bit of code. You'd have ask why you would want to do that though.
On the other hand if the goal is to provide a much richer interactive experience to the user then its likely that you'll find even a well designed business layer just doesn't behave the way such a radically different UI needs it to.

Categories

Resources