SlideShare a Scribd company logo
1 of 15
Download to read offline
.Net Template Solution

      Diogo Cunha
Architecture should be
• Flexible to change, add and remove features
• Maintanable for many developers with different
  coding habits
• Sustainable for growth
• Understandable for code review and optimization
• Easy to add new features with few lines of code
  without losing structure
• Testable (unit and integration)

                 http://pt.linkedin.com/in/diogogcunha/   2
Solution Layers dependency

       proj.Frontend


        proj.Services


             proj.Data

       http://pt.linkedin.com/in/diogogcunha/   3
Data LayerprojName.Data.dll


This layer would be a new Project inside the solution and it is an abstraction for the data
that the system writes and reads from different data sources. It should only contain CRUD
logic and nothing else.
Repositories and entity objects should be here.


                                   proj.Data




                                http://pt.linkedin.com/in/diogogcunha/                  4
Entities/DTOsprojName.Data.Entities


• Entities are the raw domain objects that come from the data source. So if you are
integrating with and external platform such as Facebook or if you are writing on a XML
you should have that information in object classes so you have strongly typed entities.
• A lot of .Net developers will use EntityFramework to do most of the work writing to the
database. Using model first this is the place to put the .edmx file, using code first this is
where you’ll put your DbContext file and your entities.
• In order to be able to mock the DbContext or the ObjectContext you should do a
wrapper around it (or a partial class) use an interface and expose what you need.
• Avoid unecessary dependecies using different projects under the same namespace.

                 UserEntity            FileEntity                              PostEntity


            UserRepository         FileRepository                     FacebookPostRepository

                 UserEntity            FileEntity                              PostEntity



                                                                                                      5
                         projName.Data.dll                               projName.Data.Facebook.dll
Repositories
                                     projName.Data.Repositories


• Each entity should have it’s own repository. If the entity is read only so should be the
repository.
• All repositories must have their own interface and it might be useful to have abstract
repositories to decrease the amount of code to be written.
• Repository methods should be easily overriden for flexibility so we could make them
virtual but it’s not mandatory because C# let’s you override a method with the [new]
word on the function signature.


abstract class BaseRepository : IBaseRepository

abstract class ReadRepository<T> : BaseRepository, IReadRepository<T>
abstract class WriteRepository<T> : ReadRepository<T>, IWriteRepository<T>

WritableEntityRepository : WriteRepository<WritableEntity>, IWritableEntityRepository
ReadOnlyEntityRepository : ReadRepository<ReadOnlyEntity>, IReadOnlyEntityRepository




                                http://pt.linkedin.com/in/diogogcunha/                       6
Repositories
                             projName.Data.Repositories.ReadRepository


• Read repository is probably the most used one, so we should try to make it as powerfull
as possible. Also because LINQ is cool I’m copying some of it’s namings.


public interface IReadRepository<T> where T : class {

         T FirstOrDefault(Expression<Func<T, bool>> predicate);

         IEnumerable<T> GetAll(Expression<Func<T, bool>> predicate);
         IEnumerable<T> GetAll(Expression<Func<T, bool>> predicate,
                                Expression<Func<T, object>> orderBy,
                                bool descending = false);

         int Count(Expression<Func<T, bool>> predicate);
         bool Any(Expression<Func<T, bool>> predicate);
}




                               http://pt.linkedin.com/in/diogogcunha/                 7
Repositories
                              projName.Data.Repositories.WriteRepository


• Creating and updating entities is usualy a fairly simple operation and it should remain
so. No other kind of logic should be implemented in these classes except default values
like , for instance a CreationDate = DateTime.Now;
• In some situations the Update method is not necessary (if you use EntityFramework for
some of your data) so don’t feel that obligated to implement this method, just leave the
possibility there for other data sources that might need it.


public interface IWriteRepository<T> where T : class {

          T Add(T entity);
          T Update(T entity);
          T Remove(T entity);
}




                                http://pt.linkedin.com/in/diogogcunha/                      8
Services Layer
                                        projName.Services.dll


    • This layer would be a new Project inside the solution that references the Data project
    and it is where all the business logic should be centralized.
    • Services should be divided by actions oriented and also reading services or writing
    services, this will allow all writing services to be dependent on their corresponding
    reading services if needed (example: instead of a UserService use UserInfoService,
    UserEditService and UserAuthService)
    • External modules should be added to avoid unwanted dependencies to the main .dll file


       Services
      ProductServices             UserServices                        Services.HttpServices
getProductDiscount()                                 addLoginCount()
       ProductEditService          UserEditService                     UserSessionService

       ProductInfoService          UserInfoService                          projName.Services.HttpServices.dll
                                                                getUser()         dependent on System.Web
                                                                                                        9
Services Layer
                                     projName.Services




public class UserInfoService : UnitOfWorkService, IUserInfoService {
         public UserInfoService(IUnitOfWork unitOfWork) : base(unitOfWork) { }
}

public class UserEditService : UnitOfWorkService, IUserInfoService {
         IUserInfoService UserInfoService { get; set; }
         public UserEditService(IUnitOfWork unitOfWork, IUserInfoService userInfoSvc)
         : base(unitOfWork) {
                   UserInfoService = userInfoSvc;
         }
}

public class UserSessionService : BaseService, IUserSessionService {
         IUserInfoService UserInfoService { get; set; }
         IUserEditService UserEditService { get; set; }
         public UserSessionService(IUserInfoService userInfoSvc,
                                    IUserEditService userEditSvc) {
                   UserEditService = userEditService;
                   UserInfoService = userInfoService;
         }
}
                              http://pt.linkedin.com/in/diogogcunha/             10
Services Layer and Data Layer
                                  projName.Data.UnitOfWork.dll


• A service will use the Unit of Work to access the data layer (the Unit of Work pattern is a
class that has a reference to all the repositories and to the context in which these
repositories work giving only access to the repositories and a SaveChanges method that
commits the changes to the database). This doesn’t need to be a separate Project.
• This should be implemented on a different Project so that when you reference the
Services on the Frontend you don’t have access to the Unit of Work.
//namespace projName.Services
abstract class UnitOfWorkService : BaseService, IUnitOfWorkService {
         private IUnitOfWork UnitOfWork { get; set; }
         public UnitOfWorkService(IUnitOfWork unitOfWork){
                   UnitOfWork = unitOfWork;
         }
}

//namespace projName.Data.UnitOfWork
public interface IUnitOfWork {
         void SaveChanges();
         public IUserRepository UserRepository { get; set; }
         public IProductsRepository ProductsRepository { get; set; }
}
                                http://pt.linkedin.com/in/diogogcunha/                   11
Mapping Entity <-> ViewModel
                                 projName.Services.Mappings


• This is probably the most boring code to write because it’s simply transforming one
object to another one, so I usually use AutoMapper which is a very handy tool.
• There are several ways to do these mappings and I believe that the big concern here is
performance and easily understand to which ViewModels does a Entity map to and how
that mapping is processed, and the other way arround.




        UserEntity                                                      UserViewModel
        -ID                                                             -UserIdentityViewModel
        -Username                                                          -ID
                                                                           -Username
        -FirstName
        -LastName
                            Mapping engine                                 -Email
        -Email                                                          -UserInfoViewModel
        -Gender                                                            -FirstName
        -CreationDate                                                      -LastName
                                                                           -Gender




                               http://pt.linkedin.com/in/diogogcunha/                            12
ViewModels
                                      projName.ViewModels.dll


• The view models should be another Project in the solution to be referenced by the
services and Frontend.
• Services only receive and return ViewModel objects that should have Frontend needs in
mind and not domain entities to make them aligned with the operations they refer to.
• Dividing the ViewModels into folders according to the entities they refer to will make
the code more maintainable.



                                    Frontend
View                                                                              View
Models                              Services                                      Models




                               http://pt.linkedin.com/in/diogogcunha/                  13
Inversion of Control
                                        projName.IoC.dll


• A separate Project should be made for the IoC (even if it only has one file with all the
class registrations) because it must reference the Services Layer and the Data Layer.
• Inversion of Control pattern can save you a lot of code lines, help you keep things
modular and improve performance.
• It’s not mandatory to use it for this architecture to work but it is as advantage.
• We can initialize a service in 3 different ways with this architecture:

public class UserController : Controller {
         private IUserInfoService _userInfoService { get; set; }

          public UserInfoService(IUserInfoService userInfoService)
          {

_userInfoService = userInfoservice;//with Dependency Injection
_userInfoService = new UserInfoService(IoC.Locator<IUnitOfWork>());//with Locator
_userInfoService = new UserInfoService(new UnitOfWork());//NO IoC

          }
}
                                 http://pt.linkedin.com/in/diogogcunha/                  14
Frontend layer
                                       projName.Frontend.dll


• Frontend layer is where your services actually get exposed in whatever way you want.
• It should be as easy to use a MVC.Net project on top of this architecture as it would be
to use WebForms, WinForms or a Mobile App.




                                      Services
                                http://pt.linkedin.com/in/diogogcunha/                  15

More Related Content

What's hot

[2015/2016] Require JS and Handlebars JS
[2015/2016] Require JS and Handlebars JS[2015/2016] Require JS and Handlebars JS
[2015/2016] Require JS and Handlebars JSIvano Malavolta
 
Suportando Aplicações Multi-tenancy com Java EE
Suportando Aplicações Multi-tenancy com Java EESuportando Aplicações Multi-tenancy com Java EE
Suportando Aplicações Multi-tenancy com Java EERodrigo Cândido da Silva
 
ASP.Net 5 and C# 6
ASP.Net 5 and C# 6ASP.Net 5 and C# 6
ASP.Net 5 and C# 6Andy Butland
 
C# Advanced L09-HTML5+ASP
C# Advanced L09-HTML5+ASPC# Advanced L09-HTML5+ASP
C# Advanced L09-HTML5+ASPMohammad Shaker
 
Session 40 - Hibernate - Part 2
Session 40 - Hibernate - Part 2Session 40 - Hibernate - Part 2
Session 40 - Hibernate - Part 2PawanMM
 
Session 35 - Design Patterns
Session 35 - Design PatternsSession 35 - Design Patterns
Session 35 - Design PatternsPawanMM
 
Unit Testing with WOUnit
Unit Testing with WOUnitUnit Testing with WOUnit
Unit Testing with WOUnitWO Community
 
Real World Asp.Net WebApi Applications
Real World Asp.Net WebApi ApplicationsReal World Asp.Net WebApi Applications
Real World Asp.Net WebApi ApplicationsEffie Arditi
 
Beyond PrettyFaces - Einführung in Rewrite
Beyond PrettyFaces - Einführung in RewriteBeyond PrettyFaces - Einführung in Rewrite
Beyond PrettyFaces - Einführung in RewriteChristian Kaltepoth
 
Session 26 - Servlets Part 2
Session 26 - Servlets Part 2Session 26 - Servlets Part 2
Session 26 - Servlets Part 2PawanMM
 
Hibernate - Part 2
Hibernate - Part 2 Hibernate - Part 2
Hibernate - Part 2 Hitesh-Java
 
Intro to Core Data
Intro to Core DataIntro to Core Data
Intro to Core DataMake School
 
Local storage in Web apps
Local storage in Web appsLocal storage in Web apps
Local storage in Web appsIvano Malavolta
 
Struts 2 - Introduction
Struts 2 - Introduction Struts 2 - Introduction
Struts 2 - Introduction Hitesh-Java
 
Session 38 - Core Java (New Features) - Part 1
Session 38 - Core Java (New Features) - Part 1Session 38 - Core Java (New Features) - Part 1
Session 38 - Core Java (New Features) - Part 1PawanMM
 
Session 36 - JSP - Part 1
Session 36 - JSP - Part 1Session 36 - JSP - Part 1
Session 36 - JSP - Part 1PawanMM
 

What's hot (20)

JavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
JavaCro'14 - Building interactive web applications with Vaadin – Peter LehtoJavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
JavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
 
[2015/2016] Require JS and Handlebars JS
[2015/2016] Require JS and Handlebars JS[2015/2016] Require JS and Handlebars JS
[2015/2016] Require JS and Handlebars JS
 
Suportando Aplicações Multi-tenancy com Java EE
Suportando Aplicações Multi-tenancy com Java EESuportando Aplicações Multi-tenancy com Java EE
Suportando Aplicações Multi-tenancy com Java EE
 
ASP.Net 5 and C# 6
ASP.Net 5 and C# 6ASP.Net 5 and C# 6
ASP.Net 5 and C# 6
 
C# Advanced L09-HTML5+ASP
C# Advanced L09-HTML5+ASPC# Advanced L09-HTML5+ASP
C# Advanced L09-HTML5+ASP
 
Web Api vs MVC
Web Api vs MVCWeb Api vs MVC
Web Api vs MVC
 
Session 40 - Hibernate - Part 2
Session 40 - Hibernate - Part 2Session 40 - Hibernate - Part 2
Session 40 - Hibernate - Part 2
 
Session 35 - Design Patterns
Session 35 - Design PatternsSession 35 - Design Patterns
Session 35 - Design Patterns
 
Unit Testing with WOUnit
Unit Testing with WOUnitUnit Testing with WOUnit
Unit Testing with WOUnit
 
JavaCro'14 - Unit testing in AngularJS – Slaven Tomac
JavaCro'14 - Unit testing in AngularJS – Slaven TomacJavaCro'14 - Unit testing in AngularJS – Slaven Tomac
JavaCro'14 - Unit testing in AngularJS – Slaven Tomac
 
Real World Asp.Net WebApi Applications
Real World Asp.Net WebApi ApplicationsReal World Asp.Net WebApi Applications
Real World Asp.Net WebApi Applications
 
Beyond PrettyFaces - Einführung in Rewrite
Beyond PrettyFaces - Einführung in RewriteBeyond PrettyFaces - Einführung in Rewrite
Beyond PrettyFaces - Einführung in Rewrite
 
Session 26 - Servlets Part 2
Session 26 - Servlets Part 2Session 26 - Servlets Part 2
Session 26 - Servlets Part 2
 
Hibernate - Part 2
Hibernate - Part 2 Hibernate - Part 2
Hibernate - Part 2
 
Intro to Core Data
Intro to Core DataIntro to Core Data
Intro to Core Data
 
Local storage in Web apps
Local storage in Web appsLocal storage in Web apps
Local storage in Web apps
 
Hibernate
HibernateHibernate
Hibernate
 
Struts 2 - Introduction
Struts 2 - Introduction Struts 2 - Introduction
Struts 2 - Introduction
 
Session 38 - Core Java (New Features) - Part 1
Session 38 - Core Java (New Features) - Part 1Session 38 - Core Java (New Features) - Part 1
Session 38 - Core Java (New Features) - Part 1
 
Session 36 - JSP - Part 1
Session 36 - JSP - Part 1Session 36 - JSP - Part 1
Session 36 - JSP - Part 1
 

Viewers also liked

Soen 423 Project Report Revised
Soen 423 Project Report   RevisedSoen 423 Project Report   Revised
Soen 423 Project Report RevisedAli Ahmed
 
Remote Procedure Call
Remote Procedure CallRemote Procedure Call
Remote Procedure CallNadia Nahar
 
Droisys development process
Droisys development processDroisys development process
Droisys development processDroisys Inc
 
Droisys development process_v_1.1
Droisys development process_v_1.1Droisys development process_v_1.1
Droisys development process_v_1.1Droisys Inc
 
Prise en compte de la dimension temporelle dans la modélisation des systèmes ...
Prise en compte de la dimension temporelle dans la modélisation des systèmes ...Prise en compte de la dimension temporelle dans la modélisation des systèmes ...
Prise en compte de la dimension temporelle dans la modélisation des systèmes ...Pierre-Marie Delpech
 
Transform your industry using the New Style of IT
Transform your industry using the New Style of ITTransform your industry using the New Style of IT
Transform your industry using the New Style of ITPierre-Marie Delpech
 
Nuts and Bolts of Scrum Template (extended)
Nuts and Bolts of Scrum Template (extended)Nuts and Bolts of Scrum Template (extended)
Nuts and Bolts of Scrum Template (extended)Alexei Govorine
 
Référentiel Général d’Interopérabilité RGI version1 0
Référentiel Général d’Interopérabilité RGI version1 0Référentiel Général d’Interopérabilité RGI version1 0
Référentiel Général d’Interopérabilité RGI version1 0Pierre-Marie Delpech
 
Application integration framework & Adaptor ppt
Application integration framework & Adaptor pptApplication integration framework & Adaptor ppt
Application integration framework & Adaptor pptAditya Negi
 
Job Training Methods and Process
Job Training Methods and ProcessJob Training Methods and Process
Job Training Methods and ProcessNadia Nahar
 
Enterprise-architecture on purpose
Enterprise-architecture on purposeEnterprise-architecture on purpose
Enterprise-architecture on purposeTetradian Consulting
 
Scrum and the agile development process
Scrum and the agile development processScrum and the agile development process
Scrum and the agile development processjhericks
 
SOA for Enterprise Architecture
SOA for Enterprise ArchitectureSOA for Enterprise Architecture
SOA for Enterprise ArchitectureYan Zhao
 
Team Foundation Server Process Templates For Effective Project Management
Team Foundation Server Process Templates For Effective Project ManagementTeam Foundation Server Process Templates For Effective Project Management
Team Foundation Server Process Templates For Effective Project ManagementAaron Bjork
 
Deadlock detection
Deadlock detectionDeadlock detection
Deadlock detectionNadia Nahar
 
Agile project management with visual studio tfs 2013 - My presentation at Reg...
Agile project management with visual studio tfs 2013 - My presentation at Reg...Agile project management with visual studio tfs 2013 - My presentation at Reg...
Agile project management with visual studio tfs 2013 - My presentation at Reg...Om Prakash Bang
 

Viewers also liked (20)

EA Workshop 1
EA Workshop 1EA Workshop 1
EA Workshop 1
 
Soen 423 Project Report Revised
Soen 423 Project Report   RevisedSoen 423 Project Report   Revised
Soen 423 Project Report Revised
 
Remote Procedure Call
Remote Procedure CallRemote Procedure Call
Remote Procedure Call
 
Droisys development process
Droisys development processDroisys development process
Droisys development process
 
Droisys development process_v_1.1
Droisys development process_v_1.1Droisys development process_v_1.1
Droisys development process_v_1.1
 
Prise en compte de la dimension temporelle dans la modélisation des systèmes ...
Prise en compte de la dimension temporelle dans la modélisation des systèmes ...Prise en compte de la dimension temporelle dans la modélisation des systèmes ...
Prise en compte de la dimension temporelle dans la modélisation des systèmes ...
 
Transform your industry using the New Style of IT
Transform your industry using the New Style of ITTransform your industry using the New Style of IT
Transform your industry using the New Style of IT
 
Nuts and Bolts of Scrum Template (extended)
Nuts and Bolts of Scrum Template (extended)Nuts and Bolts of Scrum Template (extended)
Nuts and Bolts of Scrum Template (extended)
 
Référentiel Général d’Interopérabilité RGI version1 0
Référentiel Général d’Interopérabilité RGI version1 0Référentiel Général d’Interopérabilité RGI version1 0
Référentiel Général d’Interopérabilité RGI version1 0
 
Application integration framework & Adaptor ppt
Application integration framework & Adaptor pptApplication integration framework & Adaptor ppt
Application integration framework & Adaptor ppt
 
Job Training Methods and Process
Job Training Methods and ProcessJob Training Methods and Process
Job Training Methods and Process
 
Enterprise-architecture on purpose
Enterprise-architecture on purposeEnterprise-architecture on purpose
Enterprise-architecture on purpose
 
Scrum with VS2010
Scrum with VS2010  Scrum with VS2010
Scrum with VS2010
 
Scrum and the agile development process
Scrum and the agile development processScrum and the agile development process
Scrum and the agile development process
 
Paper review
Paper reviewPaper review
Paper review
 
MAPPING TOGAF® ADM AND AGILE APPROACH
MAPPING TOGAF® ADM AND AGILE APPROACHMAPPING TOGAF® ADM AND AGILE APPROACH
MAPPING TOGAF® ADM AND AGILE APPROACH
 
SOA for Enterprise Architecture
SOA for Enterprise ArchitectureSOA for Enterprise Architecture
SOA for Enterprise Architecture
 
Team Foundation Server Process Templates For Effective Project Management
Team Foundation Server Process Templates For Effective Project ManagementTeam Foundation Server Process Templates For Effective Project Management
Team Foundation Server Process Templates For Effective Project Management
 
Deadlock detection
Deadlock detectionDeadlock detection
Deadlock detection
 
Agile project management with visual studio tfs 2013 - My presentation at Reg...
Agile project management with visual studio tfs 2013 - My presentation at Reg...Agile project management with visual studio tfs 2013 - My presentation at Reg...
Agile project management with visual studio tfs 2013 - My presentation at Reg...
 

Similar to NET Template Solution Architecture

Java Technology
Java TechnologyJava Technology
Java Technologyifnu bima
 
Mastering Test Automation: How To Use Selenium Successfully
Mastering Test Automation: How To Use Selenium SuccessfullyMastering Test Automation: How To Use Selenium Successfully
Mastering Test Automation: How To Use Selenium SuccessfullySpringPeople
 
Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...
Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...
Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...Miguel Gallardo
 
Get things done with Yii - quickly build webapplications
Get things done with Yii - quickly build webapplicationsGet things done with Yii - quickly build webapplications
Get things done with Yii - quickly build webapplicationsGiuliano Iacobelli
 
Java Web Programming on Google Cloud Platform [2/3] : Datastore
Java Web Programming on Google Cloud Platform [2/3] : DatastoreJava Web Programming on Google Cloud Platform [2/3] : Datastore
Java Web Programming on Google Cloud Platform [2/3] : DatastoreIMC Institute
 
Repository Pattern in MVC3 Application with Entity Framework
Repository Pattern in MVC3 Application with Entity FrameworkRepository Pattern in MVC3 Application with Entity Framework
Repository Pattern in MVC3 Application with Entity FrameworkAkhil Mittal
 
Elements for an iOS Backend
Elements for an iOS BackendElements for an iOS Backend
Elements for an iOS BackendLaurent Cerveau
 
Learning To Run - XPages for Lotus Notes Client Developers
Learning To Run - XPages for Lotus Notes Client DevelopersLearning To Run - XPages for Lotus Notes Client Developers
Learning To Run - XPages for Lotus Notes Client DevelopersKathy Brown
 
Advanced Web Development
Advanced Web DevelopmentAdvanced Web Development
Advanced Web DevelopmentRobert J. Stein
 
Overview of entity framework by software outsourcing company india
Overview of entity framework by software outsourcing company indiaOverview of entity framework by software outsourcing company india
Overview of entity framework by software outsourcing company indiaJignesh Aakoliya
 
GDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App EngineGDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App EngineYared Ayalew
 
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...jpalley
 
JMP103 : Extending Your App Arsenal With OpenSocial
JMP103 : Extending Your App Arsenal With OpenSocialJMP103 : Extending Your App Arsenal With OpenSocial
JMP103 : Extending Your App Arsenal With OpenSocialRyan Baxter
 
IBM Connect 2014 - JMP103: Extending Your Application Arsenal With OpenSocial
IBM Connect 2014 - JMP103: Extending Your Application Arsenal With OpenSocialIBM Connect 2014 - JMP103: Extending Your Application Arsenal With OpenSocial
IBM Connect 2014 - JMP103: Extending Your Application Arsenal With OpenSocialIBM Connections Developers
 
Multi-tenancy with Rails
Multi-tenancy with RailsMulti-tenancy with Rails
Multi-tenancy with RailsPaul Gallagher
 

Similar to NET Template Solution Architecture (20)

Java Technology
Java TechnologyJava Technology
Java Technology
 
Mastering Test Automation: How To Use Selenium Successfully
Mastering Test Automation: How To Use Selenium SuccessfullyMastering Test Automation: How To Use Selenium Successfully
Mastering Test Automation: How To Use Selenium Successfully
 
Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...
Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...
Code decoupling from Symfony (and others frameworks) - PHP Conference Brasil ...
 
KAAccessControl
KAAccessControlKAAccessControl
KAAccessControl
 
Get things done with Yii - quickly build webapplications
Get things done with Yii - quickly build webapplicationsGet things done with Yii - quickly build webapplications
Get things done with Yii - quickly build webapplications
 
Java Web Programming on Google Cloud Platform [2/3] : Datastore
Java Web Programming on Google Cloud Platform [2/3] : DatastoreJava Web Programming on Google Cloud Platform [2/3] : Datastore
Java Web Programming on Google Cloud Platform [2/3] : Datastore
 
Repository Pattern in MVC3 Application with Entity Framework
Repository Pattern in MVC3 Application with Entity FrameworkRepository Pattern in MVC3 Application with Entity Framework
Repository Pattern in MVC3 Application with Entity Framework
 
Introduction to Datastore
Introduction to DatastoreIntroduction to Datastore
Introduction to Datastore
 
Spring boot
Spring bootSpring boot
Spring boot
 
Elements for an iOS Backend
Elements for an iOS BackendElements for an iOS Backend
Elements for an iOS Backend
 
Data access
Data accessData access
Data access
 
Learning To Run - XPages for Lotus Notes Client Developers
Learning To Run - XPages for Lotus Notes Client DevelopersLearning To Run - XPages for Lotus Notes Client Developers
Learning To Run - XPages for Lotus Notes Client Developers
 
L04 base patterns
L04 base patternsL04 base patterns
L04 base patterns
 
Advanced Web Development
Advanced Web DevelopmentAdvanced Web Development
Advanced Web Development
 
Overview of entity framework by software outsourcing company india
Overview of entity framework by software outsourcing company indiaOverview of entity framework by software outsourcing company india
Overview of entity framework by software outsourcing company india
 
GDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App EngineGDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App Engine
 
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
 
JMP103 : Extending Your App Arsenal With OpenSocial
JMP103 : Extending Your App Arsenal With OpenSocialJMP103 : Extending Your App Arsenal With OpenSocial
JMP103 : Extending Your App Arsenal With OpenSocial
 
IBM Connect 2014 - JMP103: Extending Your Application Arsenal With OpenSocial
IBM Connect 2014 - JMP103: Extending Your Application Arsenal With OpenSocialIBM Connect 2014 - JMP103: Extending Your Application Arsenal With OpenSocial
IBM Connect 2014 - JMP103: Extending Your Application Arsenal With OpenSocial
 
Multi-tenancy with Rails
Multi-tenancy with RailsMulti-tenancy with Rails
Multi-tenancy with Rails
 

Recently uploaded

Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 

Recently uploaded (20)

Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 

NET Template Solution Architecture

  • 2. Architecture should be • Flexible to change, add and remove features • Maintanable for many developers with different coding habits • Sustainable for growth • Understandable for code review and optimization • Easy to add new features with few lines of code without losing structure • Testable (unit and integration) http://pt.linkedin.com/in/diogogcunha/ 2
  • 3. Solution Layers dependency proj.Frontend proj.Services proj.Data http://pt.linkedin.com/in/diogogcunha/ 3
  • 4. Data LayerprojName.Data.dll This layer would be a new Project inside the solution and it is an abstraction for the data that the system writes and reads from different data sources. It should only contain CRUD logic and nothing else. Repositories and entity objects should be here. proj.Data http://pt.linkedin.com/in/diogogcunha/ 4
  • 5. Entities/DTOsprojName.Data.Entities • Entities are the raw domain objects that come from the data source. So if you are integrating with and external platform such as Facebook or if you are writing on a XML you should have that information in object classes so you have strongly typed entities. • A lot of .Net developers will use EntityFramework to do most of the work writing to the database. Using model first this is the place to put the .edmx file, using code first this is where you’ll put your DbContext file and your entities. • In order to be able to mock the DbContext or the ObjectContext you should do a wrapper around it (or a partial class) use an interface and expose what you need. • Avoid unecessary dependecies using different projects under the same namespace. UserEntity FileEntity PostEntity UserRepository FileRepository FacebookPostRepository UserEntity FileEntity PostEntity 5 projName.Data.dll projName.Data.Facebook.dll
  • 6. Repositories projName.Data.Repositories • Each entity should have it’s own repository. If the entity is read only so should be the repository. • All repositories must have their own interface and it might be useful to have abstract repositories to decrease the amount of code to be written. • Repository methods should be easily overriden for flexibility so we could make them virtual but it’s not mandatory because C# let’s you override a method with the [new] word on the function signature. abstract class BaseRepository : IBaseRepository abstract class ReadRepository<T> : BaseRepository, IReadRepository<T> abstract class WriteRepository<T> : ReadRepository<T>, IWriteRepository<T> WritableEntityRepository : WriteRepository<WritableEntity>, IWritableEntityRepository ReadOnlyEntityRepository : ReadRepository<ReadOnlyEntity>, IReadOnlyEntityRepository http://pt.linkedin.com/in/diogogcunha/ 6
  • 7. Repositories projName.Data.Repositories.ReadRepository • Read repository is probably the most used one, so we should try to make it as powerfull as possible. Also because LINQ is cool I’m copying some of it’s namings. public interface IReadRepository<T> where T : class { T FirstOrDefault(Expression<Func<T, bool>> predicate); IEnumerable<T> GetAll(Expression<Func<T, bool>> predicate); IEnumerable<T> GetAll(Expression<Func<T, bool>> predicate, Expression<Func<T, object>> orderBy, bool descending = false); int Count(Expression<Func<T, bool>> predicate); bool Any(Expression<Func<T, bool>> predicate); } http://pt.linkedin.com/in/diogogcunha/ 7
  • 8. Repositories projName.Data.Repositories.WriteRepository • Creating and updating entities is usualy a fairly simple operation and it should remain so. No other kind of logic should be implemented in these classes except default values like , for instance a CreationDate = DateTime.Now; • In some situations the Update method is not necessary (if you use EntityFramework for some of your data) so don’t feel that obligated to implement this method, just leave the possibility there for other data sources that might need it. public interface IWriteRepository<T> where T : class { T Add(T entity); T Update(T entity); T Remove(T entity); } http://pt.linkedin.com/in/diogogcunha/ 8
  • 9. Services Layer projName.Services.dll • This layer would be a new Project inside the solution that references the Data project and it is where all the business logic should be centralized. • Services should be divided by actions oriented and also reading services or writing services, this will allow all writing services to be dependent on their corresponding reading services if needed (example: instead of a UserService use UserInfoService, UserEditService and UserAuthService) • External modules should be added to avoid unwanted dependencies to the main .dll file Services ProductServices UserServices Services.HttpServices getProductDiscount() addLoginCount() ProductEditService UserEditService UserSessionService ProductInfoService UserInfoService projName.Services.HttpServices.dll getUser() dependent on System.Web 9
  • 10. Services Layer projName.Services public class UserInfoService : UnitOfWorkService, IUserInfoService { public UserInfoService(IUnitOfWork unitOfWork) : base(unitOfWork) { } } public class UserEditService : UnitOfWorkService, IUserInfoService { IUserInfoService UserInfoService { get; set; } public UserEditService(IUnitOfWork unitOfWork, IUserInfoService userInfoSvc) : base(unitOfWork) { UserInfoService = userInfoSvc; } } public class UserSessionService : BaseService, IUserSessionService { IUserInfoService UserInfoService { get; set; } IUserEditService UserEditService { get; set; } public UserSessionService(IUserInfoService userInfoSvc, IUserEditService userEditSvc) { UserEditService = userEditService; UserInfoService = userInfoService; } } http://pt.linkedin.com/in/diogogcunha/ 10
  • 11. Services Layer and Data Layer projName.Data.UnitOfWork.dll • A service will use the Unit of Work to access the data layer (the Unit of Work pattern is a class that has a reference to all the repositories and to the context in which these repositories work giving only access to the repositories and a SaveChanges method that commits the changes to the database). This doesn’t need to be a separate Project. • This should be implemented on a different Project so that when you reference the Services on the Frontend you don’t have access to the Unit of Work. //namespace projName.Services abstract class UnitOfWorkService : BaseService, IUnitOfWorkService { private IUnitOfWork UnitOfWork { get; set; } public UnitOfWorkService(IUnitOfWork unitOfWork){ UnitOfWork = unitOfWork; } } //namespace projName.Data.UnitOfWork public interface IUnitOfWork { void SaveChanges(); public IUserRepository UserRepository { get; set; } public IProductsRepository ProductsRepository { get; set; } } http://pt.linkedin.com/in/diogogcunha/ 11
  • 12. Mapping Entity <-> ViewModel projName.Services.Mappings • This is probably the most boring code to write because it’s simply transforming one object to another one, so I usually use AutoMapper which is a very handy tool. • There are several ways to do these mappings and I believe that the big concern here is performance and easily understand to which ViewModels does a Entity map to and how that mapping is processed, and the other way arround. UserEntity UserViewModel -ID -UserIdentityViewModel -Username -ID -Username -FirstName -LastName Mapping engine -Email -Email -UserInfoViewModel -Gender -FirstName -CreationDate -LastName -Gender http://pt.linkedin.com/in/diogogcunha/ 12
  • 13. ViewModels projName.ViewModels.dll • The view models should be another Project in the solution to be referenced by the services and Frontend. • Services only receive and return ViewModel objects that should have Frontend needs in mind and not domain entities to make them aligned with the operations they refer to. • Dividing the ViewModels into folders according to the entities they refer to will make the code more maintainable. Frontend View View Models Services Models http://pt.linkedin.com/in/diogogcunha/ 13
  • 14. Inversion of Control projName.IoC.dll • A separate Project should be made for the IoC (even if it only has one file with all the class registrations) because it must reference the Services Layer and the Data Layer. • Inversion of Control pattern can save you a lot of code lines, help you keep things modular and improve performance. • It’s not mandatory to use it for this architecture to work but it is as advantage. • We can initialize a service in 3 different ways with this architecture: public class UserController : Controller { private IUserInfoService _userInfoService { get; set; } public UserInfoService(IUserInfoService userInfoService) { _userInfoService = userInfoservice;//with Dependency Injection _userInfoService = new UserInfoService(IoC.Locator<IUnitOfWork>());//with Locator _userInfoService = new UserInfoService(new UnitOfWork());//NO IoC } } http://pt.linkedin.com/in/diogogcunha/ 14
  • 15. Frontend layer projName.Frontend.dll • Frontend layer is where your services actually get exposed in whatever way you want. • It should be as easy to use a MVC.Net project on top of this architecture as it would be to use WebForms, WinForms or a Mobile App. Services http://pt.linkedin.com/in/diogogcunha/ 15