Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Repository pattern and/or/vs business logic layer

I have a problem I want to know your opinion.

I am trying to use Repository Pattern. I have a repository object which load data to a POCO. I have also created a Business logic layer which adds a little bit of functionality but basically wraps the POCO. So in the end I have a BLL which loads DAO with usage of repository.

I am not very happy with this solution. I have a three layers but I feel that BLL is not providing enought functionality to keep it there. On the other hand I do not want to put my logic in the repository layer nor data access layer?

So my question is where should I put logic for application? Which solution do you use(DAO + repo or DAO + BLL + rep or any other)?

like image 649
Assassin Avatar asked Aug 14 '10 16:08

Assassin


People also ask

What is the difference between data access layer and business logic layer?

Layered design and the data access layerThe data layer manages the physical storage and retrieval of data. The business layer maintains business rules and logic. The presentation layer houses the user interface and related presentation code.

What is the business logic layer?

The business logic layer is the business components that provide OAGIS services to return data or start business processes. The presentation layer uses these OAGIS services to display data, or to invoke a business process. The business logic provides data required by the presentation layer.

What is business logic layer in MVC?

MVC enables the application to be extensible and modular by separating the application into three parts: the business logic part, which implements data retrieval and manipulation. the user interface part, which is what the application users see. the controller part, which routes requests to the proper objects.

What is a repository pattern?

The Repository pattern. Repositories are classes or components that encapsulate the logic required to access data sources. They centralize common data access functionality, providing better maintainability and decoupling the infrastructure or technology used to access databases from the domain model layer.


1 Answers

There are two basic ways to think about business rules when designing your domain.

1.) The domain entities are basic POCO/DTOs. And you hand them off to domain services. These services could be as simple as another class, or they really could be actual services sitting on another server.

var user = repository.Find(x => x.UserName == userName); if (userLogonService.IsValidUser(user, password)) {    userLogonService.UpdateUserAsLoggedOn(user); } repository.SaveChanges(); 

2.) The domain entities contain their own operation logic. This is closer to what many MVC patterns will follow. And since you asked, this is the model that I prefer.

var user = repository.Find(x => x.UserName == userName); if (user.CheckPassword(password)) {     user.LogOnNow(); } repository.SaveChanges(); 

Both are completely valid patterns. #1 has a discrete business operation tier, but suffers from an Anemic Domain Model. #2 can lead to big domain entities if you domain starts to become complicated, or if a model can do a lot of things.

EDIT #1: Response to John Kraft

Oven.Bake(myPizza) vs. myPizza.Bake()

I mostly agree. Do you have a single Oven service, or do you have dozens of available ovens stored in an oven repository where oven is just another domain entity? In #2, the oven is part of the domain. The way I tend to do domain modeling, most nouns are domain entities, unless you are 100% sure that there is exactly one of the thing.

But something does happen to pizza when it is baked.

interface ICanBeBaked {     int BakeMinutes { get; }     int BakeTemp { get; }     void Bake(); } class Pizza : ICanBeBaked {     int BakeMinutes { get { return 15; } }     int BakeTemp { get { return 425; } }     void Bake() {         // melt cheese!         this.isBaked = true;     } } class Oven {     void Bake(ICanBeBaked thingToBake) {         // set the temp, reserve this oven for the duration, etc.         thingToBake.Bake();     } } 
like image 114
Jarrett Meyer Avatar answered Sep 20 '22 18:09

Jarrett Meyer