can you give me some hit or give me explanation how to create Enterprise App in .net, and how projects type use or how should be structure of this projects? I newbie in EE and I read about it, but for me is the best explanation on real world example. My idea about EE solution structure in .net is that:
Data Tier (project type => class library)
database access classes
some mappers (I am not sure if I could use data mapper pattern or else? Is good idea?)
Bussiness Tier (project type => class library)
entities which wil lbe mapped in data mapper in Data Tier
and some application logic
service tier (I am not sure if it should be individual tier, or subtier of bussiness tier - I want to use WCF)
Client (project type => WebForms / Android / WPF / ....)
will be communicate with bussiness tier over WCF
Is my idea good? I will be gratefull for any explanation or hint how patterns could I use with respect my low knowledge. I have requirements to use 2-3 patterns, becouse is school project. Thanks for answers
A implementation I have found quite useful is:
Data Access Layer:
Entity Framework: Unit of Work
Repository Pattern
Business Layer
This layer maps entities and db calls to DTOs
Presentation Layer
Here you present your DTOS using MV? or any other model
There you are using at least 4 design patterns.
For the data layer I would go with repository pattern and unit of work pattern. This is really good way to abstract data layer and create testable code which can be easily unit tested.
Business layer it depends, by DDD business should be encapsulated inside rich data model. Anemic data model is considered as anti pattern. But personally rich model can lead to the ruin of the separation of concern paradigm. Sometimes it is useful to have anemic data model and business layer on top of that model. Like handlers where every handler does exactly one action...
On top of business layer is usually application layer which expose interface to the outside, to your clients. It should be really thin without any business logic in it. Maybe Restful API which will enable you to connect various clients like Android, wpf, Javascript...
Related
I am a new comer in DDD concepts and I am trying to design a solution structure strictly follow DDD & Prism (WPF).
I am stacking at where to create DTO project (Data Transfer Object). As I know, DDD will have 4 general layer:
Presentation
Application
Domain
Infrastructure
So that, would you please tell me which layer for the DTO project belong to?
I have refered at: DDD - which layer DTO should be implemented
Some one told that we should implement it at Service layer, but I think It is not make sense, cause of follow DDD concept, we don't have which called Service layer.
Thank you so much,
Regards
Generally speaking, the location of the component's code should stay besides the owner of that component. The owner has full control of its components. This idea follows the dependency inversion principle.
So,in your case, who is the owner of the DTO? Who controls the structure and the purpose of that DTO?
Using DDD (in any architecture!) you should, however, take into account that domain code should not depend on infrastructure, application or UI code. So, if you decide to put the DTO class into the application layer then you cannot refer to that DTO from your domain code (i.e. a domain entity or a domain service cannot have any references to the DTO class - no import or use directive or new statements)
You might be disturbed by my answer, but I have to repeat again:
Domain-Driven Design is not about layers. It is about Domain and Design.
Domain is your problem space. This is what your users need. This is what your domain experts tell you to do.
Design is how you model your solution. It starts from the knowledge you got by speaking to domain experts. It continues with deciding what are your bounded contexts and how they are placed on the context map. Then you decide how to implement each context - would this be a Domain Model, Active Record, CRUD or some off-the-shelf software.
When you decided on the implementation, you can think of the internal structure and DDD does not dictate anything there.
If your question is where to put DTO for the data - well, they might be located in a separate project if more than one other project uses them, or you put them to the DAL (which is typical) since your presentation layer will most probably use it directly, without involving the domain model, otherwise you won't be mentioning DTOs at all.
Concerning using the term DDD for your question, I wrote a blog post some time ago, targeting this issue, which you might want to read.
I see that we should add DTO classes in the layer will create objects of them to send their to another layer.
In DDD model the Application layer and Infrastructure layer already can access the Domain layer so they don't need DTOs in the infrastructure layer because it will return entity class.
Based on the above we need DTOs to represent the data retrieved from the DB(through Infrastructure layer) in the Application layer and send these data using DTOs to the Presentation layer without making Presentation layer get access the domain entities which are contained in the Domain model layer.
Finally, from my experience and using the DDD model I prefer to add DTOs in a separate project inside the Application layer. which means it belongs to the Application layer.
You can see the sample of my project and the "Core layer" in it means the "Domain Layer"
Also you can read Excellent detailed explanation for DDD model from Microsoft
To give you a quick overview of my application architecture, I have the following layers in my application:
Domain Model - Models the problem domain and business rules.
Service Model - Models the service contract consumed by the application.
Data Access Layer - Persistence of domain models, in this case using EF.
Services - Implementations of the service model.
Website - MVC web application.
Web API - RESTful web service API.
Now the problem is that the Web API came later; the MVC web application was the first thing that was built on top of the architecture.
I find myself having to replicate business logic and ViewModels (MVC) and Messages (Web API)...According to the DRY principle, I shouldn't be doing this, so the natural solution is to push the business logic into its own layer which is independent of the application layers.
But...this means that the business logic layer needs it's own set of models which sit between the application layer and the business logic layer. In this respect, it would not be applicable to use domain models, since these really shouldn't ever hit the application layer.
So in short, I'm looking for an industry accepted standard for business logic modelling. Is there an accepted standard for how this should work, and if so, what type of model (i.e. it's not a domain model, and it's not a view model) belongs to the business logic layer?
You have stumbled upon a contested point of discussion. I myself have struggled with this for a long time.
Object bigots will argue that you shouldn't even have a service layer. Your domain model could then be directly consumed which would eliminate the duplication of logic. Granted, those were the good old days of software modeling. With the advent of the web, apis and SOAs, we are forced to look at alternative ways of modeling our software. Enter Anemic Domain models.
Anemic Domain models essentially consist of light weight objects that resemble DTOs more than anything, with underlying services that do the heavy lifting.
The architecture you have described above seems to be a hybrid design. I am guessing by now you must have run into the issue of mapping EF classes to domain objects, which creates yet another layer of objects, unless you use POCOs, in which case you run into namespace issues and what not.
Anyways, I don't think there is an industry standard. What I can tell you is that I have seen a few patterns emerge here and there leaning towards Anemic Domain Models and it's not hard to see why. In disconnected environments (e.g. web, API), complex objects don't work very well, hence the affluence of services.
Since you have layered your application nicely and do not wish to expose your domain model objects, I would suggest using Anemic Models in your service implementations. These would essentially function as DTO objects that can be reused and serialized if the need be, but can also implement basic logic that may even map back to functionality implemented in the services.
On a final note, there is no one-size-fits-all. Use the right tool for the job. Patterns are meant to be guidelines, not step-by-step instructions, so make sure you feel free to tweak them in order to fit your particular needs while retaining the general idea.
You can read more about Anemic Domain Models here:
https://en.wikipedia.org/wiki/Anemic_domain_model
Make sure to check out Martin Fowler's objections to Anemic Domain Models as well:
http://www.martinfowler.com/bliki/AnemicDomainModel.html
I am creating my first stand alone desktop WPF application using Entity Framework. Do I need a WCF layer to access database? Is this a bad practise if I just call DBContext directly from ViewModels?
TL; DR
The short answer is: it depends!
The long answer
It depends on your use case you need to implement. If you need to add another layer of abstraction -the WCF layer- to hide your OR/M away you can do it. However if your strategy is easy enough like a standalone WPF application I wouldn't bother making a WCF layer. You can simply access the IDBContext in your application, but keep in mind to not tightly couple your viewmodels with EF.
Always worth try keeping the concerns separate!
And these concerns are:
Data- or Persistence (EF) Models that are used to map your database to your OO models
ViewModels that are supporting your Views with data to show
Mapping of your Persistence and ViewModels
This way you can achieve a lightweight setup that aims for better separation and better testing ability.
Further Extensibility
Later on your development path, when you arrive at a point where you need to add an infrastructural concern like a WCF layer which could serve as a public API -or an entry point- to your shared database access, you can easily add it as a new project, put its classes behind interfaces (these are the only ones you will have as reference added to your WPF project) and let this project have the exact implementations.
I want to know the right concept about it. If I have a MVC application with Repository Pattern, where the BL should be?
Should it be inside the Model? Model should have all the business
logic before call the unitofwork to insert or not the data into
database?
Should it be in the controller? Before call the model?
Should I have a service layer to do the business logic and decide if
I should call the Model to call the UnitOfWork to save the data?
A good explanation will help a lot too.
The short answer - it depends. If it's a fairly complex or sizable application, I like to create a service layer project with the repositories as dependencies. If it's a small application, I'll put the logic in the controller. In my opinion, if it takes more time and effort to create the service layer than it would be to create the application (i.e. one or two controllers), then it doesn't make sense to me to go that route. You also need to consider the likelihood that the application will grow. What might start small could grow into something much bigger and in that case, again, it might be more beneficial to create the separate service layer.
The third one... and then some.
Your application structure could look like this (each in different projects):
Data storage layer (e.g. SQL database)
ORM (e.g. NHibernate or Entity Framework)
Domain (including abstract repositories and entities)
Service layer (and optionally business)
MVC application (which has it's own models relating to the entities)
but there are many ways to go about this depending on the complexity and size of your application.
There is no "correct" answer to this question, it is primarily opinion-based. You can read about my opinion in the following project wiki:
https://github.com/danludwig/tripod/wiki/Why-Tripod%3F
https://github.com/danludwig/tripod/wiki/Dependency-and-Control-Inversion
https://github.com/danludwig/tripod/wiki/Tripod-101
https://github.com/danludwig/tripod/wiki/Testing,-Testing,-1-2-3
https://github.com/danludwig/tripod/wiki/Command-Query-Responsibility-Segregation-(CQRS)
Another piece of advice I would like to offer is never put any business logic in viewmodels or entities. These classes should not have methods, only properties to contain data. Separate your data from behavior. Use models for data, and other types for behavior (methods).
I am using ASP.NET MVC in my application. I have divided my application into three layer architecture. 1) Data Access Layer (using Entity Framework), 2) Application/Business Layer, 3)Presentation Layer (ASP.NET MVC).
Because I am using MVC framework on my presentation layer, I am confused about the business logic. I need to know where do I put my business logic in MVC pattern. In other words we can say from where I need to call my middle layer. From the Models or from the Controllers?
If I call my business logic from Controller then It seem like the Models are useless. Other wise if I call business logic from the model then it seems like unnecessary bidden on the system because Business Object maps with model and then model is passed to the Controller. Model does exactly what DTO is doing.
Any help will be appreciated
ASP.NET MVC layer or tier doesn't contains neither business logic nor business model. M in MVC stands for UI model, not the model of your application core and MVC (as well as other MV* patterns) is generally pattern for separating UI concerns. You should send messages (call) your Business Layer (BL) from Controllers, aggregate data, create or map it results into UI model and pass it to view. Your UI model should know nothing of BL model - this distinction makes loosely coupled layers of your application.
In other words we can say from where I need to call my middle layer.
From the Models or from the Controllers?
Definitely from Controllers. You inject dependencies to it and call them from your Action methods. ASP.NET MVC provide lots of mechanisms of injection dependencies into controllers and integrates nicely with NInject, StructureMap and some other IoC containers.
Dependencies between components in MVC is given below
Picture is takes from Martin's Fowler article on GUI Architecture, which by the way, very nice reading regarding MVC and MVP.
Also, Pluralsight has set of videos on Software Practices, which covers Design Patterns. I've learned a lot from their definition of MVVM and MVP.
Reading this materials should increase your understanding not only on patterns itself, but also in how they fit into application environment and interact with it.
This is purely design/architecture decision you have to make based on your requirements.
If you want to scale up your application to support other services/applications, it is advised not to write any business logic in Controller/Model. You could write it in business/application layer. This will help you to scale up your architecture in future. Say if you want to create restful service for you mobile application, you could just write services as wrapper to re-use existing business/application layer.
Also just have a look at Domain Driven Design, Eric Evans book is worth reading.
http://dddsample.sourceforge.net/architecture.html