3

I'm new to ASP.NET MVC and inherited a project that uses the technology.

Such Web project contains three folders: Views, Controllers and Model. As I understand it, the Model contains in fact your domain / business logic and is called by your controllers. The controllers themselves act as delegators between Views and Model.

Now, in a typical layered architecture, there should be no references in any project to the Web/UI project.

I find this quite confusing:
-> The UI contains the Model, which is - in an ideal world - based on "Domain Driven Design"-principles.
-> The layers on top of the UI (Services and DataAccess) cannot have a reference to the UI

How can you write efficient services and dataaccess layers if they do not know your model?

What am I missing here? Is the Web.Model different from "DDD" and should I still have a separate BL project? If that is the case, then what is the Web.Model supposed to contain?

3 Answers 3

10

I view the Model as a concept. You can have a completely separate project containing your Domain (your entities, your services etc.) and reference that in your "UI" project. In this scenario this will be your "Model". This is what I typically do, In my Models folder I keep "ViewModels", which I use for Binding/Validation (for the UI). For example, If I have an Employee but I don't necessary want to use all its properties (or for that matter different properties), I will create an EmployeeViewModel adjust it the way I want, I'll add validation (if required) and I'll pass it to my View.

This is by no means, "the right way"/"only way", but It worked for me in the past, and I thought I'll share (also, I'm pretty terrible in explanations, so I really hope this post makes sense, in case it doesn't or clarifications are needed - please let me know).

Sign up to request clarification or add additional context in comments.

Comments

1

You necessarily do not need to have your model in the same project. You can ofcourse have those in different layers.

This is how i usually setup my projects

1) UI Project - This is an MVC Web application type project where i will have my controllers and it's views and other UI related stuff

2) Business Entities - This will be a class library type project where i will define my domain objects ( Ex : Customer). This mostly looks similar to how my DB schema looks like. These are usually just POCO's which represent my domain modal ( I use this for the CodeFirst Database generation).

3) Data Access - This will be another class library type project which has the data access classes. Usually my repository class/interfaces, my DBContext class and other data access classes will be in this project.

4) Tests - Unit tests for the project

enter image description here

Business Entities project has been added as a reference to the Data Access Project so that i can use those classes in my Data access code.

Business Entities and Data Access Projects are added as references in UI Project. I would call the data access methods from my Controllers/ Service classes.

You may also add a Service/Business logic layer between your controller's and Data access layer as needed.

I have few ViewModel classes also inside my UI project ViewModels folder. I use this for some screens where i have to show data from multiple domain objects. I have a mapping/service class which maps the domain object to view model object. If your project is bifg, you may keep this as a serperate project under the same solution

Comments

0
  • Views Contain your HTML Layouts
  • Controllers do the heavy lifting of getting data from the models or the models themselves and passing them to the Views.
  • Models are used to do actions for your BL or fetch data.

Tip : You can use a EntityFramework ( i'm recommending it because it's easy to get started with ) to fetch your data and it's dead simple to setup thus eliminating your DAL and saving you time from writing everything yourself.

Services : you can have controllers that return XML/JSON (other format?) by converting the data you have got from the DB to XML/JSON and returning that instead of a view. Take a look at MVC 4 WebApi for more details,Note that you can pretty much the same thing with mvc 3 too

Also refer to asp.net/mvc site for tutorials to get you started, they are really useful.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.