├── Proje
└── DotnetWorkshop
│ ├── DotnetWorkshop.API
│ ├── Program.cs
│ ├── appsettings.Development.json
│ ├── appsettings.json
│ ├── DotnetWorkshop.API.csproj
│ ├── Controllers
│ │ ├── CustomBaseController.cs
│ │ ├── TeamController.cs
│ │ ├── UserProfileController.cs
│ │ └── UserController.cs
│ ├── Properties
│ │ └── launchSettings.json
│ ├── MiddleWares
│ │ ├── JwtMiddleware.cs
│ │ └── UseCustomExceptionHandler.cs
│ └── Modules
│ │ └── RepoModuleService.cs
│ ├── DotnetWorkshop.Core
│ ├── DotnetWorkshop.Core.csproj
│ ├── DTOs
│ │ ├── TeamDto.cs
│ │ ├── UserDto.cs
│ │ ├── AuthResponseDto.cs
│ │ ├── UserProfileDto.cs
│ │ ├── AuthRequestDto.cs
│ │ ├── BaseDto.cs
│ │ ├── NoContentDto.cs
│ │ └── GlobalResponseDto.cs
│ ├── Models
│ │ ├── Team.cs
│ │ ├── BaseEntity.cs
│ │ ├── UserProfile.cs
│ │ └── User.cs
│ ├── Services
│ │ ├── ITeamService.cs
│ │ ├── IUserProfileService.cs
│ │ ├── IUserService.cs
│ │ └── IService.cs
│ ├── Repositories
│ │ ├── ITeamRepository.cs
│ │ ├── IUserRepository.cs
│ │ ├── IUserProfileRepository.cs
│ │ └── IGenericRepository.cs
│ └── UnitOfWorks
│ │ └── IUnitOfWork.cs
│ ├── DotnetWorkshop.Service
│ ├── Helpers
│ │ └── AppSettings.cs
│ ├── Authorization
│ │ ├── Abstract
│ │ │ └── IJwtAuthenticationManager.cs
│ │ └── Concrete
│ │ │ └── JwtAuthenticationManager.cs
│ ├── Exceptions
│ │ ├── NotFoundException.cs
│ │ └── ClientSideException.cs
│ ├── Services
│ │ ├── TeamService.cs
│ │ ├── UserProfileService.cs
│ │ ├── Service.cs
│ │ └── UserService.cs
│ ├── Validations
│ │ ├── TeamDtoValidator.cs
│ │ ├── UserProfileDtoValidator.cs
│ │ └── UserDtoValidator.cs
│ ├── DotnetWorkshop.Service.csproj
│ └── Mapping
│ │ └── MapProfile.cs
│ ├── DotnetWorkshop.Repository
│ ├── Repositories
│ │ ├── TeamRepository.cs
│ │ ├── UserRepository.cs
│ │ ├── UserProfileRepository.cs
│ │ └── GenericRepository.cs
│ ├── UnitOfWorks
│ │ └── UnitOfWork.cs
│ ├── Seeds
│ │ ├── TeamSeed.cs
│ │ ├── UserProfileSeed.cs
│ │ └── UserSeed.cs
│ ├── Configurations
│ │ ├── TeamConfiguration.cs
│ │ ├── UserProfileConfiguration.cs
│ │ └── UserConfiguration.cs
│ ├── DotnetWorkshop.Repository.csproj
│ ├── AppDbContext.cs
│ └── Migrations
│ │ ├── 20240209184236_initial.cs
│ │ ├── AppDbContextModelSnapshot.cs
│ │ └── 20240209184236_initial.Designer.cs
│ └── DotnetWorkshop.sln
├── Uygulamalar
├── C# Uygulamaları
│ └── CSharp-101
│ │ ├── CSharp102
│ │ ├── ProcessManagemnt.jpg
│ │ ├── CSharp102.csproj
│ │ └── Program.cs
│ │ ├── CSharp-Get-Started
│ │ ├── CSharp-Get-Started.csproj
│ │ └── Program.cs
│ │ └── CSharp-101.sln
├── MSSQL Uygulamaları
│ ├── Teach_Yourself_SQL_in_21_days_FULL.pdf
│ ├── data-definition-examples.sql
│ ├── data-manipulation-examples.sql
│ └── sql-examples.md
└── solid
│ └── Solid
│ ├── Liskow
│ ├── Liskow.csproj
│ └── Program.cs
│ ├── OpenClosed
│ ├── OpenClosed.csproj
│ └── Program.cs
│ ├── DependencyInversion
│ ├── DependencyInversion.csproj
│ └── Program.cs
│ ├── InterfaceSegregation
│ ├── InterfaceSegregation.csproj
│ └── Program.cs
│ ├── SingleResponsibility
│ ├── SingleResponsibility.csproj
│ └── Program.cs
│ └── Solid.sln
├── modern-web-gelistirme-13.md
├── ben-kimim.md
├── README.md
├── odevlendirme.md
├── modern-web-gelistirme-9.md
├── modern-web-gelistirme-5.md
├── .gitignore
├── modern-web-gelistirme-10.md
├── modern-web-gelistirme-11.md
├── modern-web-gelistirme-4.md
└── modern-web-gelistirme-8.md
/Proje/DotnetWorkshop/DotnetWorkshop.API/Program.cs:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KardelRuveyda/sektor-kampuste-modern-web-gelistirme-temelleri/HEAD/Proje/DotnetWorkshop/DotnetWorkshop.API/Program.cs
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.API/appsettings.Development.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft.AspNetCore": "Warning"
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/Uygulamalar/C# Uygulamaları/CSharp-101/CSharp102/ProcessManagemnt.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KardelRuveyda/sektor-kampuste-modern-web-gelistirme-temelleri/HEAD/Uygulamalar/C# Uygulamaları/CSharp-101/CSharp102/ProcessManagemnt.jpg
--------------------------------------------------------------------------------
/Uygulamalar/MSSQL Uygulamaları/Teach_Yourself_SQL_in_21_days_FULL.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KardelRuveyda/sektor-kampuste-modern-web-gelistirme-temelleri/HEAD/Uygulamalar/MSSQL Uygulamaları/Teach_Yourself_SQL_in_21_days_FULL.pdf
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/DotnetWorkshop.Core.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net6.0
5 | enable
6 | enable
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/Uygulamalar/solid/Solid/Liskow/Liskow.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | net6.0
6 | enable
7 | enable
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Uygulamalar/solid/Solid/OpenClosed/OpenClosed.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | net6.0
6 | enable
7 | enable
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/modern-web-gelistirme-13.md:
--------------------------------------------------------------------------------
1 | # N-Layer Proje Yapısı
2 |
3 |
4 | 📚 Bu not kapsamında notlar Medium üzerindedir. Medium'daki yazımı okumak için buraya tıklayabilirsiniz!
5 |
--------------------------------------------------------------------------------
/Uygulamalar/C# Uygulamaları/CSharp-101/CSharp102/CSharp102.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | net6.0
6 | enable
7 | enable
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Uygulamalar/solid/Solid/DependencyInversion/DependencyInversion.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | net6.0
6 | enable
7 | enable
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Uygulamalar/solid/Solid/InterfaceSegregation/InterfaceSegregation.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | net6.0
6 | enable
7 | enable
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Uygulamalar/solid/Solid/SingleResponsibility/SingleResponsibility.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | net6.0
6 | enable
7 | enable
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/DTOs/TeamDto.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DotnetWorkshop.Core.DTOs
8 | {
9 | public class TeamDto:BaseDto
10 | {
11 | public string TeamName { get; set; }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/DTOs/UserDto.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DotnetWorkshop.Core.DTOs
8 | {
9 | public class UserDto:BaseDto
10 | {
11 | public string UserName { get; set; }
12 | public string Email { get; set; }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Service/Helpers/AppSettings.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DotnetWorkshop.Service.Helpers
8 | {
9 | public class AppSettings
10 | {
11 | public string Secret { get; set; } = "dotnet_panel_key_value_here_secret";
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/DTOs/AuthResponseDto.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DotnetWorkshop.Core.DTOs
8 | {
9 | public class AuthResponseDto
10 | {
11 | public string Token { get; set; }
12 | public UserDto User { get; set; }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/DTOs/UserProfileDto.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DotnetWorkshop.Core.DTOs
8 | {
9 | public class UserProfileDto
10 | {
11 | public string FirstName { get; set; }
12 | public string LastName { get; set; }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/Models/Team.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DotnetWorkshop.Core.Models
8 | {
9 | public class Team:BaseEntity
10 | {
11 | public string TeamName { get; set; }
12 | public ICollection Users { get; set; }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/Services/ITeamService.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Linq.Expressions;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace DotnetWorkshop.Core.Services
10 | {
11 | public interface ITeamService : IService
12 | {
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Uygulamalar/C# Uygulamaları/CSharp-101/CSharp-Get-Started/CSharp-Get-Started.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | net6.0
6 | CSharp_Get_Started
7 | enable
8 | enable
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/Services/IUserProfileService.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Linq.Expressions;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace DotnetWorkshop.Core.Services
10 | {
11 | public interface IUserProfileService : IService
12 | {
13 |
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/Repositories/ITeamRepository.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Linq.Expressions;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace DotnetWorkshop.Core.Repositories
10 | {
11 | public interface ITeamRepository:IGenericRepository
12 | {
13 |
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/Repositories/IUserRepository.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Linq.Expressions;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace DotnetWorkshop.Core.Repositories
10 | {
11 | public interface IUserRepository:IGenericRepository
12 | {
13 |
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/UnitOfWorks/IUnitOfWork.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DotnetWorkshop.Core.UnitOfWorks
8 | {
9 | public interface IUnitOfWork
10 | {
11 | Task CommitAsync(); //SaveChangesAsync temsil etsin.
12 | void Commit();//Savechanges() temsil etsin.
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/DTOs/AuthRequestDto.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DotnetWorkshop.Core.DTOs
8 | {
9 | public class AuthRequestDto
10 | {
11 | public string Email { get; set; }
12 | public string UserName { get; set; }
13 | public string Password { get; set; }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/DTOs/BaseDto.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DotnetWorkshop.Core.DTOs
8 | {
9 | public abstract class BaseDto
10 | {
11 | public int Id { get; set; }
12 | public DateTime CreatedDate { get; set; }
13 | public DateTime? UpdatedDate { get; set; }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/Models/BaseEntity.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DotnetWorkshop.Core.Models
8 | {
9 | public abstract class BaseEntity
10 | {
11 | public int Id { get; set; }
12 | public DateTime CreatedDate { get; set; }
13 | public DateTime? UpdatedDate { get; set; }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/Repositories/IUserProfileRepository.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Linq.Expressions;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace DotnetWorkshop.Core.Repositories
10 | {
11 | public interface IUserProfileRepository:IGenericRepository
12 | {
13 |
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/DTOs/NoContentDto.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Text.Json.Serialization;
6 | using System.Threading.Tasks;
7 |
8 | namespace DotnetWorkshop.Core.DTOs
9 | {
10 | public class NoContentDto
11 | {
12 | [JsonIgnore]
13 | public int StatusCode { get; set; }
14 | public List Errors { get; set; }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.API/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "ConnectionStrings": {
3 | "SqlConnection": "Data Source=DT870;Initial Catalog=DotnetWorkshop;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
4 | },
5 | "Logging": {
6 | "LogLevel": {
7 | "Default": "Information",
8 | "Microsoft.AspNetCore": "Warning"
9 | }
10 | },
11 | "AllowedHosts": "*"
12 | }
13 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Service/Authorization/Abstract/IJwtAuthenticationManager.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.DTOs;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace DotnetWorkshop.Service.Authorization.Abstract
9 | {
10 | public interface IJwtAuthenticationManager
11 | {
12 | AuthResponseDto Authenticate(string userName, string password);
13 | int? ValidateJwtToken(string token);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/Repositories/TeamRepository.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using DotnetWorkshop.Core.Repositories;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace DotnetWorkshop.Repository.Repositories
10 | {
11 | public class UserRepository : GenericRepository,IUserRepository
12 | {
13 | public UserRepository(AppDbContext context) : base(context)
14 | {
15 |
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/Repositories/UserRepository.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using DotnetWorkshop.Core.Repositories;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace DotnetWorkshop.Repository.Repositories
10 | {
11 | public class TeamRepository:GenericRepository,ITeamRepository
12 | {
13 | public TeamRepository(AppDbContext context) : base(context)
14 | {
15 |
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/Repositories/UserProfileRepository.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using DotnetWorkshop.Core.Repositories;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace DotnetWorkshop.Repository.Repositories
10 | {
11 | public class UserProfileRepository : GenericRepository,IUserProfileRepository
12 | {
13 | public UserProfileRepository(AppDbContext context) : base(context)
14 | {
15 |
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/Models/UserProfile.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DotnetWorkshop.Core.Models
8 | {
9 | public class UserProfile
10 | {
11 | public int Id { get; set; }
12 | public string FirstName { get; set; }
13 | public string LastName { get; set; }
14 |
15 | //Foreign Key
16 | public int UserId { get; set; }
17 | //Bire bir ilişki
18 | public User User { get; set; } //Navigation Property
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Service/Exceptions/NotFoundException.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Runtime.Serialization;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace DotnetWorkshop.Service.Exceptions
9 | {
10 | [Serializable]
11 | public class NotFoundException : Exception
12 | {
13 | public NotFoundException(string message):base(message)
14 | {
15 |
16 | }
17 |
18 | protected NotFoundException(SerializationInfo info,StreamingContext context):base(info,context)
19 | {
20 |
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Service/Exceptions/ClientSideException.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Runtime.Serialization;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace DotnetWorkshop.Service.Exceptions
9 | {
10 | [Serializable]
11 | public class ClientSideException:Exception
12 | {
13 | public ClientSideException(string message):base(message)
14 | {
15 |
16 | }
17 |
18 | protected ClientSideException(SerializationInfo info,StreamingContext context):base(info,context)
19 | {
20 |
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Service/Services/TeamService.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using DotnetWorkshop.Core.Repositories;
3 | using DotnetWorkshop.Core.Services;
4 | using DotnetWorkshop.Core.UnitOfWorks;
5 | using System;
6 | using System.Collections.Generic;
7 | using System.Linq;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 |
11 | namespace DotnetWorkshop.Service.Services
12 | {
13 | public class TeamService : Service, ITeamService
14 | {
15 | public TeamService(IGenericRepository repository, IUnitOfWork unitOfWork) : base(repository, unitOfWork)
16 | {
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Service/Validations/TeamDtoValidator.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.DTOs;
2 | using FluentValidation;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace DotnetWorkshop.Service.Validations
10 | {
11 | public class TeamDtoValidator:AbstractValidator
12 | {
13 | public TeamDtoValidator()
14 | {
15 | RuleFor(x => x.TeamName).NotNull().WithMessage("{PropertyName} null geçilemez.")
16 | .NotEmpty().WithMessage("{PropertyName} boş geçilemez.");
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Service/DotnetWorkshop.Service.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net6.0
5 | enable
6 | enable
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Service/Services/UserProfileService.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using DotnetWorkshop.Core.Repositories;
3 | using DotnetWorkshop.Core.Services;
4 | using DotnetWorkshop.Core.UnitOfWorks;
5 | using System;
6 | using System.Collections.Generic;
7 | using System.Linq;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 |
11 | namespace DotnetWorkshop.Service.Services
12 | {
13 | public class UserProfileService : Service,IUserProfileService
14 | {
15 | public UserProfileService(IGenericRepository repository, IUnitOfWork unitOfWork) : base(repository, unitOfWork)
16 | {
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/Models/User.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel.DataAnnotations.Schema;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace DotnetWorkshop.Core.Models
9 | {
10 | public class User:BaseEntity
11 | {
12 | public string UserName { get; set; }
13 | public string Email { get; set; }
14 | public string Password { get; set; }
15 | //İlişkilendirme
16 | //Foreign Key
17 | public int TeamId { get; set; }
18 | public Team Team { get; set; } //Bire çok ilişkiyi temsil etmek için navigasyon özelliği eklendi.
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/Services/IUserService.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.DTOs;
2 | using DotnetWorkshop.Core.Models;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Linq.Expressions;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace DotnetWorkshop.Core.Services
11 | {
12 | public interface IUserService : IService
13 | {
14 | string GeneratePasswordHash(string userName, string password);
15 | UserDto FindUser(string userName, string password);
16 | AuthResponseDto Login(AuthRequestDto request);
17 | UserDto SignUp(AuthRequestDto request);
18 | UserDto GetByUserName(string userName);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/Services/IService.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Linq.Expressions;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace DotnetWorkshop.Core.Services
9 | {
10 | public interface IService where T : class
11 | {
12 | Task GetByIdAsync(int id);
13 | Task> GetAllAsync();
14 | IQueryable Where(Expression> expression);
15 | Task AddAsync(T entity);
16 | Task> AddRangeAsync(IEnumerable entities);
17 | Task UpdateAsync(T entity);
18 | Task RemoveAsync(T entity);
19 | Task RemoveRangeAsync(IEnumerable entities);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/UnitOfWorks/UnitOfWork.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.UnitOfWorks;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace DotnetWorkshop.Repository.UnitOfWorks
9 | {
10 | public class UnitOfWork : IUnitOfWork
11 | {
12 | private readonly AppDbContext _context;
13 |
14 | public UnitOfWork(AppDbContext context)
15 | {
16 | _context = context;
17 | }
18 | public void Commit()
19 | {
20 | _context.SaveChanges();
21 | }
22 |
23 | public async Task CommitAsync()
24 | {
25 | await _context.SaveChangesAsync();
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/Seeds/TeamSeed.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using Microsoft.EntityFrameworkCore;
3 | using Microsoft.EntityFrameworkCore.Metadata.Builders;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace DotnetWorkshop.Repository.Seeds
11 | {
12 | public class TeamSeed : IEntityTypeConfiguration
13 | {
14 | public void Configure(EntityTypeBuilder builder)
15 | {
16 | builder.HasData(
17 |
18 | new Team { Id = 1, TeamName = "Takım 1" },
19 | new Team { Id = 2, TeamName = "Takım 2" },
20 | new Team { Id = 3, TeamName = "Takım 3" }
21 | );
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/Repositories/IGenericRepository.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Linq.Expressions;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace DotnetWorkshop.Core.Repositories
9 | {
10 | public interface IGenericRepository where T : class
11 | {
12 | Task GetByIdAsync(int id);
13 |
14 | //user.GetAll(s => s.userName == "kardel").Where(s => s.id >1);
15 | IQueryable GetAll();
16 | IQueryable Where(Expression> expression);
17 | Task AddAsync(T entity);
18 | Task AddRangeAsync(IEnumerable entities);
19 | void Update(T entity);
20 | void Remove(T entity);
21 | void RemoveRange(IEnumerable entities);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Service/Validations/UserProfileDtoValidator.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.DTOs;
2 | using FluentValidation;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace DotnetWorkshop.Service.Validations
10 | {
11 | public class UserProfileDtoValidator : AbstractValidator
12 | {
13 | public UserProfileDtoValidator()
14 | {
15 | RuleFor(x => x.FirstName).NotEmpty().WithMessage("{PropertyName} boş geçilemez.")
16 | .NotNull().WithMessage("{PropertyName} null geçilemez.");
17 |
18 | RuleFor(x => x.LastName).NotEmpty().WithMessage("{PropertyName} boş geçilemez.")
19 | .NotNull().WithMessage("{PropertyName} null geçilemez.");
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Service/Mapping/MapProfile.cs:
--------------------------------------------------------------------------------
1 | using AutoMapper;
2 | using DotnetWorkshop.Core.DTOs;
3 | using DotnetWorkshop.Core.Models;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace DotnetWorkshop.Service.Mapping
11 | {
12 | public class MapProfile:Profile
13 | {
14 | public MapProfile()
15 | {
16 | CreateMap().ReverseMap();
17 | CreateMap().ReverseMap();
18 | CreateMap().ReverseMap();
19 |
20 |
21 | //Dto'dan Entity'e çevirmek istersem;
22 | CreateMap();
23 | CreateMap();
24 | CreateMap();
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.API/DotnetWorkshop.API.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net6.0
5 | enable
6 | enable
7 |
8 |
9 |
10 |
11 |
12 | all
13 | runtime; build; native; contentfiles; analyzers; buildtransitive
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.API/Controllers/CustomBaseController.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.DTOs;
2 | using Microsoft.AspNetCore.Http;
3 | using Microsoft.AspNetCore.Mvc;
4 |
5 | namespace DotnetWorkshop.API.Controllers
6 | {
7 | [Route("api/[controller]")]
8 | //localhost:5000/api/Team
9 | [ApiController]
10 | public class CustomBaseController : ControllerBase
11 | {
12 | [NonAction]
13 | public IActionResult CreateActionResult(GlobalResponseDto response)
14 | {
15 | if(response.StatusCode == 204)
16 | {
17 | return new ObjectResult(null)
18 | {
19 | StatusCode = response.StatusCode
20 | };
21 | }
22 |
23 | return new ObjectResult(response)
24 | {
25 | StatusCode = response.StatusCode
26 | };
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/Seeds/UserProfileSeed.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using Microsoft.EntityFrameworkCore;
3 | using Microsoft.EntityFrameworkCore.Metadata.Builders;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace DotnetWorkshop.Repository.Seeds
11 | {
12 | internal class UserProfileSeed : IEntityTypeConfiguration
13 | {
14 | public void Configure(EntityTypeBuilder builder)
15 | {
16 | builder.HasData(
17 | new UserProfile { Id = 1, FirstName = "Test 1", LastName = "Test test 1", UserId = 1 },
18 | new UserProfile { Id = 2, FirstName = "Test 2", LastName = "Test test 2", UserId = 2 },
19 | new UserProfile { Id = 3, FirstName = "Test 3", LastName = "Test test 3", UserId = 3 }
20 | );
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/Seeds/UserSeed.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using Microsoft.EntityFrameworkCore;
3 | using Microsoft.EntityFrameworkCore.Metadata.Builders;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace DotnetWorkshop.Repository.Seeds
11 | {
12 | internal class UserSeed : IEntityTypeConfiguration
13 | {
14 | public void Configure(EntityTypeBuilder builder)
15 | {
16 | builder.HasData(
17 | new User { Id = 1, UserName = "test1", Email = "test1@gmail.com", Password = "123123", TeamId = 1 },
18 | new User { Id = 2, UserName = "test2", Email = "test2@gmail.com", Password = "134134", TeamId = 2 },
19 | new User { Id = 3, UserName = "test3", Email = "test3@gmail.com", Password = "354565", TeamId = 3 }
20 | );
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.API/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/launchsettings.json",
3 | "iisSettings": {
4 | "windowsAuthentication": false,
5 | "anonymousAuthentication": true,
6 | "iisExpress": {
7 | "applicationUrl": "http://localhost:3150",
8 | "sslPort": 44303
9 | }
10 | },
11 | "profiles": {
12 | "DotnetWorkshop.API": {
13 | "commandName": "Project",
14 | "dotnetRunMessages": true,
15 | "launchBrowser": true,
16 | "launchUrl": "swagger",
17 | "applicationUrl": "https://localhost:7009;http://localhost:5009",
18 | "environmentVariables": {
19 | "ASPNETCORE_ENVIRONMENT": "Development"
20 | }
21 | },
22 | "IIS Express": {
23 | "commandName": "IISExpress",
24 | "launchBrowser": true,
25 | "launchUrl": "swagger",
26 | "environmentVariables": {
27 | "ASPNETCORE_ENVIRONMENT": "Development"
28 | }
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Service/Validations/UserDtoValidator.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.DTOs;
2 | using FluentValidation;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace DotnetWorkshop.Service.Validations
10 | {
11 | public class UserDtoValidator:AbstractValidator
12 | {
13 | public UserDtoValidator()
14 | {
15 | RuleFor(x => x.UserName).NotEmpty().WithMessage("{PropertyName} boş geçilemez.")
16 | .NotNull().WithMessage("{PropertyName} null geçilemez.")
17 | .MaximumLength(50).WithMessage("Kullanıcı adı en fazla 50 karakter olmalıdır.");
18 |
19 | RuleFor(x => x.Email).NotEmpty().WithMessage("{PropertyName} boş geçilemez.")
20 | .NotNull().WithMessage("{PropertyName} null geçilemez.")
21 | .EmailAddress().WithMessage("Geçerli bir e-posta adresi giriniz.");
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/Configurations/TeamConfiguration.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using Microsoft.EntityFrameworkCore;
3 | using Microsoft.EntityFrameworkCore.Metadata.Builders;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace DotnetWorkshop.Repository.Configurations
11 | {
12 | public class TeamConfiguration : IEntityTypeConfiguration
13 | {
14 | public void Configure(EntityTypeBuilder builder)
15 | {
16 | //Fluent Api Ayarlamaları
17 |
18 | //Primary Key Tanımlası
19 | builder.HasKey(x => x.Id);
20 |
21 | //Primary Key otomatik olarak 1er 1er artsın.
22 | builder.Property(x => x.Id)
23 | .UseIdentityColumn();
24 |
25 | //TeamName alanı için maks uzunluk belirleme
26 |
27 | builder.Property(x => x.TeamName)
28 | .HasMaxLength(50)
29 | .IsRequired();
30 |
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Uygulamalar/MSSQL Uygulamaları/data-definition-examples.sql:
--------------------------------------------------------------------------------
1 | --Data Definition Language Examples
2 | --Create Table
3 | -- id int IDENTITY(1,1) id sütunun tam sayı türünde ve
4 | --ve otomatik artan olarak tanımlanmasını sağlamış olursunuz.
5 | create table TestTable(
6 | id int IDENTITY(1,1) PRIMARY KEY,
7 | name nvarchar(50),
8 | surname nvarchar(50),
9 | age int
10 | );
11 |
12 |
13 | -- YeniSutun diye bir alan eklemek istiyorum. ( int tipinde )
14 | ALTER TABLE TestTable
15 | ADD NewColumn int
16 |
17 | -- -- YeniSutun diye bir alan eklemek istiyorum. ( NVARCHAR tipinde )
18 |
19 | ALTER TABLE TestTable
20 | ADD NewColumn_2 NVARCHAR(100)
21 |
22 | -- TesTable tablosundaki tüm kayıtları silmek için
23 | -- DDL sorgusunu kullanmam gerekir. O da Truncate metotudur.
24 | Truncate table TestTable
25 |
26 | -- Eklenen kolonları silmek için
27 | -- DDL sorgusu olan Drop kullanılır.
28 | -- NewColumn_2 silindi.
29 |
30 | ALTER TABLE TestTable
31 | DROP COLUMN NewColumn_2
32 |
33 | --NewColumn silinsin
34 | ALTER TABLE TestTable
35 | DROP COLUMN NewColumn
36 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/Configurations/UserProfileConfiguration.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using Microsoft.EntityFrameworkCore;
3 | using Microsoft.EntityFrameworkCore.Metadata.Builders;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace DotnetWorkshop.Repository.Configurations
11 | {
12 | public class UserProfileConfiguration : IEntityTypeConfiguration
13 | {
14 | public void Configure(EntityTypeBuilder builder)
15 | {
16 | //Fluent Api Ayarlamaları
17 |
18 | //Primary Key Tanımlası
19 | builder.HasKey(x => x.Id);
20 |
21 | //Primary Key otomatik olarak 1er 1er artsın.
22 | builder.Property(x => x.Id)
23 | .UseIdentityColumn();
24 |
25 | //userName alanının max uzunluğu 50
26 | builder.Property(x => x.FirstName).IsRequired().HasMaxLength(250);
27 | builder.Property(x => x.LastName).IsRequired().HasMaxLength(250);
28 |
29 | //
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/DotnetWorkshop.Repository.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net6.0
5 | enable
6 | enable
7 |
8 |
9 |
10 |
11 |
12 | all
13 | runtime; build; native; contentfiles; analyzers; buildtransitive
14 |
15 |
16 |
17 | all
18 | runtime; build; native; contentfiles; analyzers; buildtransitive
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/Configurations/UserConfiguration.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using Microsoft.EntityFrameworkCore;
3 | using Microsoft.EntityFrameworkCore.Metadata.Builders;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace DotnetWorkshop.Repository.Configurations
11 | {
12 | public class UserConfiguration : IEntityTypeConfiguration
13 | {
14 | public void Configure(EntityTypeBuilder builder)
15 | {
16 |
17 | //Fluent Api Ayarlamaları
18 |
19 | //Primary Key Tanımlası
20 | builder.HasKey(x => x.Id);
21 |
22 | //Primary Key otomatik olarak 1er 1er artsın.
23 | builder.Property(x => x.Id)
24 | .UseIdentityColumn();
25 |
26 | //userName alanının max uzunluğu 50
27 | builder.Property(x => x.UserName).IsRequired().HasMaxLength(50);
28 | builder.Property(x => x.Email).IsRequired().HasMaxLength(250);
29 | builder.Property(x => x.Password).IsRequired().HasMaxLength(250);
30 |
31 | //tablonun isim değişikliği
32 | //builder.ToTable("UserrrProfilee");
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.API/MiddleWares/JwtMiddleware.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Services;
2 | using DotnetWorkshop.Service.Authorization.Abstract;
3 |
4 | namespace DotnetWorkshop.API.MiddleWares
5 | {
6 | public class JwtMiddleware
7 | {
8 | private readonly RequestDelegate _next;
9 |
10 | public JwtMiddleware(RequestDelegate next)
11 | {
12 | _next = next;
13 | }
14 |
15 | public async Task Invoke(HttpContext context, IUserService userService, IJwtAuthenticationManager iJwtAuthenticationManager)
16 | {
17 | var authorizationHeader = context.Request.Headers["Authorization"].FirstOrDefault();
18 | string token = null;
19 |
20 | if (!string.IsNullOrEmpty(authorizationHeader))
21 | {
22 | var parts = authorizationHeader.Split(" ");
23 | if (parts.Length > 1)
24 | {
25 | token = parts[parts.Length - 1];
26 | }
27 | }
28 |
29 | var userId = iJwtAuthenticationManager.ValidateJwtToken(token);
30 | if (userId != null)
31 | {
32 | // attach user to context on successful jwt validation
33 | context.Items["User"] = userService.GetByIdAsync(userId.Value).Result;
34 | }
35 |
36 | await _next(context);
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.API/MiddleWares/UseCustomExceptionHandler.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.DTOs;
2 | using DotnetWorkshop.Service.Exceptions;
3 | using Microsoft.AspNetCore.Diagnostics;
4 | using Microsoft.AspNetCore.Http;
5 | using Microsoft.AspNetCore.Mvc;
6 | using System.Text.Json;
7 |
8 | namespace DotnetWorkshop.API.MiddleWares
9 | {
10 | public static class UseCustomExceptionHandler
11 | {
12 | public static void UseCustomException(this IApplicationBuilder app)
13 | {
14 | app.UseExceptionHandler(config =>
15 | {
16 | config.Run(async context =>
17 | {
18 | context.Response.ContentType = "application/json";
19 |
20 | var exceptionFeature = context.Features.Get();
21 |
22 | var statusCode = exceptionFeature.Error switch
23 | {
24 | ClientSideException => 400,
25 | NotFoundException => 404,
26 | _ => 500
27 | };
28 |
29 | context.Response.StatusCode = statusCode;
30 |
31 | var response = GlobalResponseDto.Fail(statusCode, exceptionFeature.Error.Message);
32 | await context.Response.WriteAsync(JsonSerializer.Serialize(response));
33 | });
34 |
35 | });
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Core/DTOs/GlobalResponseDto.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Text.Json.Serialization;
6 | using System.Threading.Tasks;
7 |
8 | namespace DotnetWorkshop.Core.DTOs
9 | {
10 | public class GlobalResponseDto
11 | {
12 | public T Data { get; set; }
13 |
14 | [JsonIgnore]
15 | public int StatusCode { get; set; }
16 |
17 | public List Errors { get; set; }
18 |
19 | //Add için aşağıdaki uygun olabilir
20 | public static GlobalResponseDto Success(int statusCode,T data)
21 | {
22 | return new GlobalResponseDto { Data = data, StatusCode = statusCode };
23 | }
24 | //Update ve Remove için aşağıdaki örnek uygun olabilir.
25 |
26 | public static GlobalResponseDto Success(int statusCode)
27 | {
28 | return new GlobalResponseDto { StatusCode = statusCode };
29 | }
30 |
31 | public static GlobalResponseDto Fail(int statusCode,List errors)
32 | {
33 | return new GlobalResponseDto { StatusCode = statusCode, Errors = errors };
34 | }
35 |
36 | public static GlobalResponseDto Fail(int statusCode, string error)
37 | {
38 | return new GlobalResponseDto { StatusCode = statusCode, Errors = new List { error } };
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/ben-kimim.md:
--------------------------------------------------------------------------------
1 | ### Ben Kimim?
2 | 1995 yılında İstanbul'da doğdum. Akademik yolculuğum Yıldız Teknik Üniversitesi Matematik Mühendisliği lisans programında başladı ve 2018 yılında mezun oldum. Yazılım kariyerime üniversitenin son senesinde bir startup firmasında yazılım geliştirici olarak başladım. Ardından, hemen mezun olduktan sonra Kariyer.net'te çalışmaya başladım ve yaklaşık üç yıl süresince yazılım geliştirici olarak görev yaptım. Bu deneyimlerin ardından, Kıdemli Yazılım Uzmanı olarak görev yapmak üzere Doğuş Teknoloji'ye geçiş yaptım ve şu anki pozisyonumda yaklaşık 2.5 yıldır çalışmaktayım. Profesyonel kariyer hayatımın yanı sıra, akademik kariyerime de Yıldız Teknik Üniversitesi Matematik Mühendisliği bölümünde tezli yüksek lisans programında devam ediyorum. Bu programa başlamadan önce 2020 yılında, Yıldız Teknik Üniversitesi Bilgisayar Mühendisliği/Bilgi Teknolojileri (Tezsiz yüksek lisans) programını tamamladım. Akademik çalışmalarımı ve iş hayatımı bir arada sürdürerek kendimi sürekli geliştirmeye ve katkıda bulunmaya devam ediyorum.
3 |
4 | 🏆1 Eylül 2024 tarihi itibariyle,gönüllü olarak gerçekleştirdiğim paylaşımlar ve topluluk çalışmaları sonucunda #Microsoft .NET alanında **Microsoft Most Valuable Professional (MVP)** unvanına layık görüldüm. Bu muhteşem topluluğun bir parçası olduğum için büyük bir gurur ve minnettarlık duyuyorum!
5 |
6 | 
7 | 
8 |
--------------------------------------------------------------------------------
/Uygulamalar/C# Uygulamaları/CSharp-101/CSharp-101.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.0.31903.59
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSharp-Get-Started", "CSharp-Get-Started\CSharp-Get-Started.csproj", "{3824735E-B92D-40EC-81E0-CE9750A23BCE}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharp102", "CSharp102\CSharp102.csproj", "{A04C1DAB-6E9F-4249-AEBD-0FE65FB650DB}"
9 | EndProject
10 | Global
11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 | Debug|Any CPU = Debug|Any CPU
13 | Release|Any CPU = Release|Any CPU
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {3824735E-B92D-40EC-81E0-CE9750A23BCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17 | {3824735E-B92D-40EC-81E0-CE9750A23BCE}.Debug|Any CPU.Build.0 = Debug|Any CPU
18 | {3824735E-B92D-40EC-81E0-CE9750A23BCE}.Release|Any CPU.ActiveCfg = Release|Any CPU
19 | {3824735E-B92D-40EC-81E0-CE9750A23BCE}.Release|Any CPU.Build.0 = Release|Any CPU
20 | {A04C1DAB-6E9F-4249-AEBD-0FE65FB650DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21 | {A04C1DAB-6E9F-4249-AEBD-0FE65FB650DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
22 | {A04C1DAB-6E9F-4249-AEBD-0FE65FB650DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 | {A04C1DAB-6E9F-4249-AEBD-0FE65FB650DB}.Release|Any CPU.Build.0 = Release|Any CPU
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | GlobalSection(ExtensibilityGlobals) = postSolution
29 | SolutionGuid = {8816EFBA-87B3-41F4-8E04-308BFC1431B6}
30 | EndGlobalSection
31 | EndGlobal
32 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/Repositories/GenericRepository.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Repositories;
2 | using Microsoft.EntityFrameworkCore;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Linq.Expressions;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace DotnetWorkshop.Repository.Repositories
11 | {
12 | public class GenericRepository : IGenericRepository where T : class
13 | {
14 | protected readonly AppDbContext _context;
15 | private readonly DbSet _dbSet;
16 |
17 | public GenericRepository(AppDbContext context)
18 | {
19 | _context = context;
20 | _dbSet = _context.Set();
21 | }
22 | public async Task AddAsync(T entity)
23 | {
24 | await _dbSet.AddAsync(entity);
25 | }
26 |
27 | public async Task AddRangeAsync(IEnumerable entities)
28 | {
29 | await _dbSet.AddRangeAsync(entities);
30 | }
31 |
32 | public IQueryable GetAll()
33 | {
34 | return _dbSet.AsNoTracking().AsQueryable();
35 | }
36 |
37 | public async Task GetByIdAsync(int id)
38 | {
39 | return await _dbSet.FindAsync(id);
40 | }
41 |
42 | public void Remove(T entity)
43 | {
44 | //_context.Entry(entity).State = EntityState.Deleted;
45 | _dbSet.Remove(entity);
46 | }
47 |
48 | public void RemoveRange(IEnumerable entities)
49 | {
50 | _dbSet.RemoveRange(entities);
51 | }
52 |
53 | public void Update(T entity)
54 | {
55 | _dbSet.Update(entity);
56 | }
57 |
58 | public IQueryable Where(Expression> expression)
59 | {
60 | return _dbSet.Where(expression);
61 | }
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/Uygulamalar/solid/Solid/DependencyInversion/Program.cs:
--------------------------------------------------------------------------------
1 | #region Kodun Çalıştırıldığı Kısım
2 | void RunCars()
3 | {
4 | //Hata verirse Dependency ile log bassın.
5 |
6 | new TripIfoLoggerDependency(new TurkeyLoggerDependency()).Log();
7 | new TripIfoLoggerDependency(new FranceLoggerDependency()).Log();
8 |
9 | //Dependency kullanmasa
10 |
11 | new TripInfoLogger().LogToTurkey("test");
12 | new TripInfoLogger().LogInfoFrance("test");
13 | }
14 | #endregion
15 |
16 |
17 |
18 | #region Dependency Inversion Kullanılmasa ?
19 |
20 | public class TripInfoLogger
21 | {
22 | public void LogToTurkey(string tripInfo)
23 | {
24 | new TurkeyLogger().Log();
25 | }
26 |
27 | public void LogInfoFrance(string logInfo)
28 | {
29 | new FranceLogger().Log();
30 | }
31 | }
32 |
33 |
34 | public class TurkeyLogger
35 | {
36 | public void Log()
37 | {
38 | Console.WriteLine("Turkiye için loglama yapıldı.");
39 | }
40 | }
41 |
42 | public class FranceLogger
43 | {
44 | public void Log()
45 | {
46 | Console.WriteLine("Fransa için loglama yapıldı.");
47 | }
48 | }
49 | #endregion
50 |
51 | #region Dependency olursa nasıl yaparım ?
52 |
53 | public class TripIfoLoggerDependency
54 | {
55 | private ILoggerDependency _logger;
56 |
57 | public TripIfoLoggerDependency(ILoggerDependency logger)
58 | {
59 | _logger = logger;
60 | }
61 |
62 | public void Log()
63 | {
64 | _logger.Log();
65 | }
66 | }
67 |
68 | public class TurkeyLoggerDependency : ILoggerDependency
69 | {
70 | public void Log()
71 | {
72 | Console.WriteLine("Türkiye için loglama yapıldı.");
73 | }
74 | }
75 |
76 | public class FranceLoggerDependency : ILoggerDependency
77 | {
78 | public void Log()
79 | {
80 | Console.WriteLine("Fransa için loglama yapıldı.");
81 | }
82 | }
83 | public interface ILoggerDependency
84 | {
85 | void Log();
86 | }
87 |
88 | #endregion
--------------------------------------------------------------------------------
/Uygulamalar/solid/Solid/SingleResponsibility/Program.cs:
--------------------------------------------------------------------------------
1 | #region Kodun Çalıştırıldığı Kısım
2 | Renault renault = new Renault();
3 | //renault.SendInfoDriver(new DriverInfo
4 | //{
5 | // City = "Trabzon",
6 | // EmailAdress = "kardel@gmail.com",
7 | // Telephone = "32432432423"
8 | //});
9 |
10 |
11 | renault.SendInfoDriverSms(new DriverInfo
12 | {
13 | City = "Trabzon",
14 | EmailAdress = "kardel@gmail.com",
15 | Telephone = "32432432423"
16 | });
17 |
18 | renault.SendInfoDriverMail(new DriverInfo
19 | {
20 | City = "Trabzon",
21 | EmailAdress = "kardel@gmail.com",
22 | Telephone = "32432432423"
23 | });
24 |
25 | #endregion
26 | public class Renault
27 | {
28 | public int RoadKm { get; set; }
29 |
30 | public void Go()
31 | {
32 | Console.WriteLine("Araba gidiyor..");
33 | }
34 |
35 | public void Stop()
36 | {
37 | Console.WriteLine("Araba durdu..");
38 | }
39 |
40 | public void SendMail()
41 | {
42 | Console.WriteLine("Mail gönderildi.");
43 | }
44 |
45 | public void SendSms()
46 | {
47 | Console.WriteLine("Sms gönderildi.");
48 | }
49 |
50 | #region Single Resp. Uymayan bir kod yazalım
51 | public void SendInfoDriver(DriverInfo info)
52 | {
53 | if (!String.IsNullOrEmpty(info.EmailAdress))
54 | {
55 | SendMail();
56 | }
57 |
58 | if (!String.IsNullOrEmpty(info.Telephone))
59 | {
60 | SendSms();
61 | }
62 | }
63 | #endregion
64 |
65 | #region Signle Resp. Uyan Yapı
66 | public void SendInfoDriverMail(DriverInfo info)
67 | {
68 | if (!String.IsNullOrEmpty(info.EmailAdress))
69 | {
70 | SendMail();
71 | }
72 | }
73 |
74 | public void SendInfoDriverSms(DriverInfo info)
75 | {
76 | if (!String.IsNullOrEmpty(info.Telephone))
77 | {
78 | SendSms();
79 | }
80 | }
81 | #endregion
82 |
83 | }
84 |
85 | public class DriverInfo
86 | {
87 | public string EmailAdress { get; set; }
88 | public string Telephone { get; set; }
89 | public string City { get; set; }
90 | }
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Service/Services/Service.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Repositories;
2 | using DotnetWorkshop.Core.Services;
3 | using DotnetWorkshop.Core.UnitOfWorks;
4 | using DotnetWorkshop.Repository;
5 | using Microsoft.EntityFrameworkCore;
6 | using System;
7 | using System.Collections.Generic;
8 | using System.Linq;
9 | using System.Linq.Expressions;
10 | using System.Text;
11 | using System.Threading.Tasks;
12 |
13 | namespace DotnetWorkshop.Service.Services
14 | {
15 | public class Service : IService where T : class
16 | {
17 | private readonly IGenericRepository _repository;
18 | private readonly IUnitOfWork _unitOfWork;
19 | public Service(IGenericRepository repository, IUnitOfWork unitOfWork)
20 | {
21 | _repository = repository;
22 | _unitOfWork = unitOfWork;
23 | }
24 | public async Task AddAsync(T entity)
25 | {
26 | await _repository.AddAsync(entity);
27 | await _unitOfWork.CommitAsync();
28 | return entity;
29 | }
30 |
31 | public async Task> AddRangeAsync(IEnumerable entities)
32 | {
33 | await _repository.AddRangeAsync(entities);
34 | await _unitOfWork.CommitAsync();
35 | return entities;
36 | }
37 |
38 | public async Task> GetAllAsync()
39 | {
40 | return await _repository.GetAll().ToListAsync();
41 | }
42 |
43 | public async Task GetByIdAsync(int id)
44 | {
45 | return await _repository.GetByIdAsync(id);
46 | }
47 |
48 | public async Task RemoveAsync(T entity)
49 | {
50 | _repository.Remove(entity);
51 | await _unitOfWork.CommitAsync();
52 | }
53 |
54 | public async Task RemoveRangeAsync(IEnumerable entities)
55 | {
56 | _repository.RemoveRange(entities);
57 | await _unitOfWork.CommitAsync();
58 | }
59 |
60 | public async Task UpdateAsync(T entity)
61 | {
62 | _repository.Update(entity);
63 | await _unitOfWork.CommitAsync();
64 | }
65 |
66 | public IQueryable Where(Expression> expression)
67 | {
68 | return _repository.Where(expression);
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.API/Controllers/TeamController.cs:
--------------------------------------------------------------------------------
1 | using AutoMapper;
2 | using DotnetWorkshop.Core.DTOs;
3 | using DotnetWorkshop.Core.Models;
4 | using DotnetWorkshop.Core.Services;
5 | using Microsoft.AspNetCore.Http;
6 | using Microsoft.AspNetCore.Mvc;
7 |
8 | namespace DotnetWorkshop.API.Controllers
9 | {
10 | public class TeamController : CustomBaseController
11 | {
12 | private readonly IMapper _mapper;
13 | private readonly ITeamService _teamService;
14 |
15 | public TeamController(IMapper mapper, ITeamService teamService)
16 | {
17 | _mapper = mapper;
18 | _teamService = teamService;
19 | }
20 |
21 | [HttpGet]
22 | // api/Team
23 | public async Task All()
24 | {
25 | var teams = await _teamService.GetAllAsync();
26 | var teamsDto = _mapper.Map>(teams.ToList());
27 | return CreateActionResult(GlobalResponseDto>.Success(200, teamsDto));
28 | }
29 |
30 | [HttpGet("{id}")]
31 | // Get api/Team/3
32 | public async Task GetById(int id)
33 | {
34 | var team = await _teamService.GetByIdAsync(id);
35 | var teamDto = _mapper.Map(team);
36 | return CreateActionResult(GlobalResponseDto.Success(200, teamDto));
37 | }
38 |
39 | [HttpPost]
40 | public async Task Save(TeamDto teamDto)
41 | {
42 | var team = await _teamService.AddAsync(_mapper.Map(teamDto));
43 | var teamDtos = _mapper.Map(team);
44 | return CreateActionResult(GlobalResponseDto.Success(201,teamDtos));
45 | }
46 |
47 | [HttpPut]
48 | public async Task Update(TeamDto teamDto)
49 | {
50 | await _teamService.UpdateAsync(_mapper.Map(teamDto));
51 | return CreateActionResult(GlobalResponseDto.Success(204));
52 | }
53 |
54 | [HttpDelete("{id}")]
55 | public async Task Remove(int id)
56 | {
57 | var team = await _teamService.GetByIdAsync(id);
58 | await _teamService.RemoveAsync(team);
59 |
60 | return CreateActionResult(GlobalResponseDto.Success(204));
61 | }
62 |
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.API/Modules/RepoModuleService.cs:
--------------------------------------------------------------------------------
1 | using Autofac;
2 | using DotnetWorkshop.Core.Repositories;
3 | using DotnetWorkshop.Core.Services;
4 | using DotnetWorkshop.Core.UnitOfWorks;
5 | using DotnetWorkshop.Repository;
6 | using DotnetWorkshop.Repository.Repositories;
7 | using DotnetWorkshop.Repository.UnitOfWorks;
8 | using DotnetWorkshop.Service.Mapping;
9 | using DotnetWorkshop.Service.Services;
10 | using System.Reflection;
11 |
12 | namespace DotnetWorkshop.API.Modules
13 | {
14 | public class RepoModuleService : Autofac.Module
15 | {
16 | protected override void Load(ContainerBuilder builder)
17 | {
18 | //Generic metotlar için aşağıdaki alanlarını belirttik
19 | builder.RegisterGeneric(typeof(GenericRepository<>)).As(typeof(IGenericRepository<>)).InstancePerLifetimeScope();
20 | builder.RegisterGeneric(typeof(Service<>)).As(typeof(IService<>)).InstancePerLifetimeScope();
21 |
22 | //Generic değildi o yüzden type olarak eklememiz gereken : Unitofwork
23 | builder.RegisterType().As();
24 |
25 | //Bulunduğu klasörde ara işlemi için aşağıdaki kod yazılmalıdır.
26 | var apiAssembly = Assembly.GetExecutingAssembly();
27 |
28 | //Repo katmanındaki herhangi bir classı type of içinde verebilirsiniz. Bu şekilde diğerlerini de bulacaktır.
29 | var repoAssembly = Assembly.GetAssembly(typeof(AppDbContext));
30 | //Service katmanındaki herhangi bir classı typeof içerisinde verirsen Service katmanını bulabiliyor.
31 | var serviceAssembly = Assembly.GetAssembly(typeof(MapProfile));
32 |
33 | //InstancePerLifeTimeScope -> Program.cs'de kullandığım AddScoped buna karşılık gelir.
34 | //InstancePerDependency => Program.cs'de kullandığım AddTransiet metotuna karşılık gelir.
35 |
36 | builder.RegisterAssemblyTypes(apiAssembly, repoAssembly, serviceAssembly).Where(x => x.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerLifetimeScope();
37 | builder.RegisterAssemblyTypes(apiAssembly, repoAssembly, serviceAssembly).Where(x => x.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerLifetimeScope();
38 | //builder.RegisterAssemblyTypes(apiAssembly, repoAssembly, serviceAssembly).Where(x => x.Name.EndsWith("Manager")).AsImplementedInterfaces().InstancePerLifetimeScope();
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Uygulamalar/solid/Solid/Liskow/Program.cs:
--------------------------------------------------------------------------------
1 | #region Kodun Çalıştırılma Kısmı
2 |
3 | SendSMSRenault();
4 | void SendSMSRenault()
5 | {
6 | var renault = new Renault();
7 | renault.SendInfoDriverSms(new DriverInfo
8 | {
9 | City = "Tes",
10 | EmailAdress = "ruve@gmail.com",
11 | Telephone = "213123213"
12 | });
13 | }
14 | #endregion
15 |
16 | #region Renault işlemleri
17 | public class Renault : BaseCar,ISmsSendable
18 | {
19 | public override double GetCostPerKM()
20 | {
21 | return 2.5;
22 | }
23 |
24 | public void SendInfoDriverSms(DriverInfo info)
25 | {
26 | Console.WriteLine("Sms gönderildi.");
27 | }
28 | }
29 |
30 | #endregion
31 |
32 | #region Nissan işlemleri için
33 |
34 | public class Nissan : BaseCar,ISmsSendable,IMailSendable
35 | {
36 | public override double GetCostPerKM()
37 | {
38 | return 1.5;
39 | }
40 |
41 | public void SendInfoDriverEmail(DriverInfo info)
42 | {
43 | Console.WriteLine("Email gönderildi.");
44 | }
45 |
46 | public void SendInfoDriverSms(DriverInfo info)
47 | {
48 | Console.WriteLine("Sms gönderildi.");
49 |
50 | }
51 | }
52 |
53 | #endregion
54 |
55 |
56 | #region Yakıt Giderlerini Hesaplayan Bir Class
57 | public class FuelCostCalculator
58 | {
59 | public double Calculate(BaseCar car)
60 | {
61 | return car.RoadKm * car.GetCostPerKM();
62 | }
63 |
64 | }
65 | #endregion
66 |
67 | #region Base Car Abstract Class'ı ( Tekrar tekrar kod yazmadan kaçınmak için bir soyut sınıf açtık.)
68 | public abstract class BaseCar
69 | {
70 | public double RoadKm { get; set; } = 2.2;
71 |
72 | public abstract double GetCostPerKM();
73 | public void Go()
74 | {
75 | Console.WriteLine("Araba gidiyor..");
76 | }
77 |
78 | public void Stop()
79 | {
80 | Console.WriteLine("Araba durdu..");
81 | }
82 | }
83 |
84 | #endregion
85 |
86 | #region Interfacelerin Oluşturulması
87 | //SMS interface tanımlaması
88 | public interface ISmsSendable
89 | {
90 | void SendInfoDriverSms(DriverInfo info);
91 | }
92 |
93 | //Mail interface tanımlaması
94 |
95 | public interface IMailSendable
96 | {
97 | void SendInfoDriverEmail(DriverInfo info);
98 | }
99 |
100 | #endregion
101 |
102 | public class DriverInfo
103 | {
104 | public string EmailAdress { get; set; }
105 | public string Telephone { get; set; }
106 | public string City { get; set; }
107 | }
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.API/Controllers/UserProfileController.cs:
--------------------------------------------------------------------------------
1 | using AutoMapper;
2 | using DotnetWorkshop.Core.DTOs;
3 | using DotnetWorkshop.Core.Models;
4 | using DotnetWorkshop.Core.Services;
5 | using Microsoft.AspNetCore.Http;
6 | using Microsoft.AspNetCore.Mvc;
7 |
8 | namespace DotnetWorkshop.API.Controllers
9 | {
10 | public class UserProfileController : CustomBaseController
11 | {
12 | private readonly IMapper _mapper;
13 | private readonly IUserProfileService _userProfileService;
14 | public UserProfileController(IMapper mapper, IUserProfileService userProfileService)
15 | {
16 | _mapper = mapper;
17 | _userProfileService = userProfileService;
18 | }
19 | // api/UserProfile/
20 | [HttpGet]
21 | public async Task All()
22 | {
23 | var userProfiles = await _userProfileService.GetAllAsync();
24 | var userProfilesDto = _mapper.Map>(userProfiles.ToList());
25 | return CreateActionResult(GlobalResponseDto>.Success(200, userProfilesDto));
26 | }
27 |
28 | [HttpGet("{id}")]
29 | public async Task GetById(int id)
30 | {
31 | var userProfile = await _userProfileService.GetByIdAsync(id);
32 | var userProfileDto = _mapper.Map(userProfile);
33 | return CreateActionResult(GlobalResponseDto.Success(200, userProfileDto));
34 | }
35 |
36 | [HttpPost]
37 | public async Task Save(UserProfileDto userProfileDto)
38 | {
39 | var userProfile = await _userProfileService.AddAsync(_mapper.Map(userProfileDto));
40 | var userProfileDtos = _mapper.Map(userProfile);
41 | return CreateActionResult(GlobalResponseDto.Success(201, userProfileDtos));
42 | }
43 |
44 | [HttpPut]
45 | public async Task Update(UserProfileDto userProfileDto)
46 | {
47 | await _userProfileService.UpdateAsync(_mapper.Map(userProfileDto));
48 | return CreateActionResult(GlobalResponseDto.Success(204));
49 | }
50 |
51 | [HttpDelete("{id}")]
52 | public async Task Remove(int id)
53 | {
54 | var userProfile = await _userProfileService.GetByIdAsync(id);
55 | await _userProfileService.RemoveAsync(userProfile);
56 |
57 | return CreateActionResult(GlobalResponseDto.Success(204));
58 | }
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.API/Controllers/UserController.cs:
--------------------------------------------------------------------------------
1 | using AutoMapper;
2 | using DotnetWorkshop.Core.DTOs;
3 | using DotnetWorkshop.Core.Models;
4 | using DotnetWorkshop.Core.Services;
5 | using Microsoft.AspNetCore.Http;
6 | using Microsoft.AspNetCore.Mvc;
7 |
8 | namespace DotnetWorkshop.API.Controllers
9 | {
10 | public class UserController : CustomBaseController
11 | {
12 | private readonly IMapper _mapper;
13 | private readonly IUserService _userService;
14 | public UserController(IMapper mapper, IUserService userService)
15 | {
16 | _mapper = mapper;
17 | _userService = userService;
18 | }
19 | // api/Team/
20 | [HttpGet]
21 | public async Task All()
22 | {
23 | var users = await _userService.GetAllAsync();
24 | var userDto = _mapper.Map>(users.ToList());
25 | return CreateActionResult(GlobalResponseDto>.Success(200, userDto));
26 | }
27 |
28 | [HttpGet("{id}")]
29 | // Get api/user/3
30 | public async Task GetById(int id)
31 | {
32 | var user = await _userService.GetByIdAsync(id);
33 | var userDto = _mapper.Map(user);
34 | return CreateActionResult(GlobalResponseDto.Success(200, userDto));
35 | }
36 |
37 | [HttpPut]
38 | public async Task Update(UserDto userDto)
39 | {
40 | await _userService.UpdateAsync(_mapper.Map(userDto));
41 | return CreateActionResult(GlobalResponseDto.Success(204));
42 | }
43 |
44 | [HttpDelete("{id}")]
45 | public async Task Remove(int id)
46 | {
47 | var user = await _userService.GetByIdAsync(id);
48 | await _userService.RemoveAsync(user);
49 |
50 | return CreateActionResult(GlobalResponseDto.Success(204));
51 | }
52 |
53 | [HttpPost("Login")]
54 | public IActionResult Login(AuthRequestDto requestDto)
55 | {
56 | var result = _userService.Login(requestDto);
57 |
58 | if (result.User != null)
59 | return CreateActionResult(GlobalResponseDto.Success(200, result));
60 | else
61 | return CreateActionResult(GlobalResponseDto.Success(401, result));
62 | }
63 |
64 | [HttpPost("Signup")]
65 | public async Task SignUp(AuthRequestDto requestDto)
66 | {
67 | var user = _userService.SignUp(requestDto);
68 | return CreateActionResult(GlobalResponseDto.Success(201, user));
69 | }
70 | }
71 |
72 | }
73 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.0.31903.59
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotnetWorkshop.Core", "DotnetWorkshop.Core\DotnetWorkshop.Core.csproj", "{22D3C6D1-79DA-4F61-B697-F7707F416F00}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotnetWorkshop.Repository", "DotnetWorkshop.Repository\DotnetWorkshop.Repository.csproj", "{8AD40D72-0303-4692-A5EF-7985FA1D9DF9}"
9 | EndProject
10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotnetWorkshop.Service", "DotnetWorkshop.Service\DotnetWorkshop.Service.csproj", "{511142A9-FBB4-4016-ABD7-1D6E6FE703D0}"
11 | EndProject
12 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotnetWorkshop.API", "DotnetWorkshop.API\DotnetWorkshop.API.csproj", "{5A63C9C3-8217-4922-97A5-0C4C47E9BABB}"
13 | EndProject
14 | Global
15 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
16 | Debug|Any CPU = Debug|Any CPU
17 | Release|Any CPU = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
20 | {22D3C6D1-79DA-4F61-B697-F7707F416F00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21 | {22D3C6D1-79DA-4F61-B697-F7707F416F00}.Debug|Any CPU.Build.0 = Debug|Any CPU
22 | {22D3C6D1-79DA-4F61-B697-F7707F416F00}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 | {22D3C6D1-79DA-4F61-B697-F7707F416F00}.Release|Any CPU.Build.0 = Release|Any CPU
24 | {8AD40D72-0303-4692-A5EF-7985FA1D9DF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
25 | {8AD40D72-0303-4692-A5EF-7985FA1D9DF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
26 | {8AD40D72-0303-4692-A5EF-7985FA1D9DF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
27 | {8AD40D72-0303-4692-A5EF-7985FA1D9DF9}.Release|Any CPU.Build.0 = Release|Any CPU
28 | {511142A9-FBB4-4016-ABD7-1D6E6FE703D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
29 | {511142A9-FBB4-4016-ABD7-1D6E6FE703D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
30 | {511142A9-FBB4-4016-ABD7-1D6E6FE703D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
31 | {511142A9-FBB4-4016-ABD7-1D6E6FE703D0}.Release|Any CPU.Build.0 = Release|Any CPU
32 | {5A63C9C3-8217-4922-97A5-0C4C47E9BABB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
33 | {5A63C9C3-8217-4922-97A5-0C4C47E9BABB}.Debug|Any CPU.Build.0 = Debug|Any CPU
34 | {5A63C9C3-8217-4922-97A5-0C4C47E9BABB}.Release|Any CPU.ActiveCfg = Release|Any CPU
35 | {5A63C9C3-8217-4922-97A5-0C4C47E9BABB}.Release|Any CPU.Build.0 = Release|Any CPU
36 | EndGlobalSection
37 | GlobalSection(SolutionProperties) = preSolution
38 | HideSolutionNode = FALSE
39 | EndGlobalSection
40 | GlobalSection(ExtensibilityGlobals) = postSolution
41 | SolutionGuid = {CAADD72C-9598-43BA-8DBC-A4FB98D0A7C4}
42 | EndGlobalSection
43 | EndGlobal
44 |
--------------------------------------------------------------------------------
/Uygulamalar/solid/Solid/OpenClosed/Program.cs:
--------------------------------------------------------------------------------
1 | #region Kodun Çalıştırıldığı Kısım
2 | CalculateTripCost();
3 | void CalculateTripCost()
4 | {
5 | var calculator = new FuelCostCalculator();
6 | var costRenault = calculator.Calculate(new Renault());
7 | var costNissan = calculator.Calculate(new Nissan());
8 | var costBMW = calculator.Calculate(new BMW());
9 |
10 | Console.WriteLine($"Renault Yaktığı Km Fiyatı: {costRenault}");
11 | Console.WriteLine($"Nissan Yaktığı Km Fiyatı: {costNissan}");
12 | Console.WriteLine($"BMW Yaktığı Km Fiyatı: {costBMW}");
13 | }
14 | #endregion
15 |
16 | #region Renault işlemleri
17 | public class Renault : BaseCar
18 | {
19 | public override double GetCostPerKM()
20 | {
21 | return 2.5;
22 | }
23 | }
24 |
25 | #endregion
26 |
27 | #region Nissan işlemleri için
28 |
29 | public class Nissan : BaseCar
30 | {
31 | public override double GetCostPerKM()
32 | {
33 | return 1.5;
34 | }
35 | }
36 |
37 | #endregion
38 |
39 | #region BMW
40 | public class BMW : BaseCar
41 | {
42 | public override double GetCostPerKM()
43 | {
44 | return 4.5;
45 | }
46 | }
47 | #endregion
48 |
49 | #region Yakıt Giderlerini Hesaplayan Bir Class
50 | public class FuelCostCalculator{
51 | public double Calculate(BaseCar car)
52 | {
53 | //if(car is Nissan)
54 | //{
55 | // return car.RoadKm * 2.2;
56 | //}else if(car is Renault)
57 | //{
58 | // return car.RoadKm * 2.8;
59 | //}else if(car is BMW)
60 | //{
61 | // return car.RoadKm * 2.9;
62 | //}
63 | //else
64 | //{
65 | // return 10.5;
66 | //}
67 | return car.RoadKm * car.GetCostPerKM();
68 | }
69 |
70 | }
71 | #endregion
72 |
73 | #region Base Car Abstract Class'ı ( Tekrar tekrar kod yazmadan kaçınmak için bir soyut sınıf açtık.)
74 | public abstract class BaseCar
75 | {
76 | public double RoadKm { get; set; } = 2.2;
77 |
78 | public abstract double GetCostPerKM();
79 | public void Go()
80 | {
81 | Console.WriteLine("Araba gidiyor..");
82 | }
83 |
84 | public void Stop()
85 | {
86 | Console.WriteLine("Araba durdu..");
87 | }
88 |
89 | public void SendMail()
90 | {
91 | Console.WriteLine("Mail gönderildi.");
92 | }
93 |
94 | public void SendSms()
95 | {
96 | Console.WriteLine("Sms gönderildi.");
97 | }
98 |
99 | #region Signle Resp. Uyan Yapı
100 | public void SendInfoDriverMail(DriverInfo info)
101 | {
102 | if (!String.IsNullOrEmpty(info.EmailAdress))
103 | {
104 | SendMail();
105 | }
106 | }
107 |
108 | public void SendInfoDriverSms(DriverInfo info)
109 | {
110 | if (!String.IsNullOrEmpty(info.Telephone))
111 | {
112 | SendSms();
113 | }
114 | }
115 | #endregion
116 | }
117 |
118 | #endregion
119 |
120 | public class DriverInfo
121 | {
122 | public string EmailAdress { get; set; }
123 | public string Telephone { get; set; }
124 | public string City { get; set; }
125 | }
--------------------------------------------------------------------------------
/Uygulamalar/solid/Solid/Solid.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.0.31903.59
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SingleResponsibility", "SingleResponsibility\SingleResponsibility.csproj", "{C94DA9DE-8CE1-430A-8017-ECADEDAC12C5}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenClosed", "OpenClosed\OpenClosed.csproj", "{7E651449-20BB-47A9-8FF1-AE74FBEBECC0}"
9 | EndProject
10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Liskow", "Liskow\Liskow.csproj", "{04A96D9E-54C9-4664-A2BD-AF442EB19DA6}"
11 | EndProject
12 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InterfaceSegregation", "InterfaceSegregation\InterfaceSegregation.csproj", "{D4E028D5-E804-4A3B-B517-05EDFE684532}"
13 | EndProject
14 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DependencyInversion", "DependencyInversion\DependencyInversion.csproj", "{673F9E1C-BD0D-4132-BD67-7AA0CED5C3F6}"
15 | EndProject
16 | Global
17 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
18 | Debug|Any CPU = Debug|Any CPU
19 | Release|Any CPU = Release|Any CPU
20 | EndGlobalSection
21 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
22 | {C94DA9DE-8CE1-430A-8017-ECADEDAC12C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
23 | {C94DA9DE-8CE1-430A-8017-ECADEDAC12C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
24 | {C94DA9DE-8CE1-430A-8017-ECADEDAC12C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
25 | {C94DA9DE-8CE1-430A-8017-ECADEDAC12C5}.Release|Any CPU.Build.0 = Release|Any CPU
26 | {7E651449-20BB-47A9-8FF1-AE74FBEBECC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
27 | {7E651449-20BB-47A9-8FF1-AE74FBEBECC0}.Debug|Any CPU.Build.0 = Debug|Any CPU
28 | {7E651449-20BB-47A9-8FF1-AE74FBEBECC0}.Release|Any CPU.ActiveCfg = Release|Any CPU
29 | {7E651449-20BB-47A9-8FF1-AE74FBEBECC0}.Release|Any CPU.Build.0 = Release|Any CPU
30 | {04A96D9E-54C9-4664-A2BD-AF442EB19DA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
31 | {04A96D9E-54C9-4664-A2BD-AF442EB19DA6}.Debug|Any CPU.Build.0 = Debug|Any CPU
32 | {04A96D9E-54C9-4664-A2BD-AF442EB19DA6}.Release|Any CPU.ActiveCfg = Release|Any CPU
33 | {04A96D9E-54C9-4664-A2BD-AF442EB19DA6}.Release|Any CPU.Build.0 = Release|Any CPU
34 | {D4E028D5-E804-4A3B-B517-05EDFE684532}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
35 | {D4E028D5-E804-4A3B-B517-05EDFE684532}.Debug|Any CPU.Build.0 = Debug|Any CPU
36 | {D4E028D5-E804-4A3B-B517-05EDFE684532}.Release|Any CPU.ActiveCfg = Release|Any CPU
37 | {D4E028D5-E804-4A3B-B517-05EDFE684532}.Release|Any CPU.Build.0 = Release|Any CPU
38 | {673F9E1C-BD0D-4132-BD67-7AA0CED5C3F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
39 | {673F9E1C-BD0D-4132-BD67-7AA0CED5C3F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
40 | {673F9E1C-BD0D-4132-BD67-7AA0CED5C3F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
41 | {673F9E1C-BD0D-4132-BD67-7AA0CED5C3F6}.Release|Any CPU.Build.0 = Release|Any CPU
42 | EndGlobalSection
43 | GlobalSection(SolutionProperties) = preSolution
44 | HideSolutionNode = FALSE
45 | EndGlobalSection
46 | GlobalSection(ExtensibilityGlobals) = postSolution
47 | SolutionGuid = {3512ADE3-7A08-4C69-A4AC-E9A4ED74FA6B}
48 | EndGlobalSection
49 | EndGlobal
50 |
--------------------------------------------------------------------------------
/Uygulamalar/solid/Solid/InterfaceSegregation/Program.cs:
--------------------------------------------------------------------------------
1 | #region Kodun çalıştırıldığı yer
2 | SendMultipleMail();
3 | void SendMultipleMail()
4 | {
5 | List drivers = new List();
6 | drivers.Add(new DriverInfo
7 | {
8 | City = "İstanbul",
9 | EmailAdress = "kardel@gmail.com",
10 | Telephone = "5305153061"
11 | });
12 |
13 | var nissan = new Nissan();
14 | nissan.SendInfoDriverEmails(drivers);
15 | }
16 | #endregion
17 |
18 |
19 | #region Renault işlemleri
20 | public class Renault : BaseCar, ISmsSendable,IMailSendable
21 | {
22 | public override double GetCostPerKM()
23 | {
24 | return 2.5;
25 | }
26 |
27 | public void SendInfoDriverEmail(DriverInfo info)
28 | {
29 | Console.WriteLine("Mail gönderilme işlemi gerçekleşti.");
30 | }
31 |
32 | public void SendInfoDriverSms(DriverInfo info)
33 | {
34 | Console.WriteLine("Sms gönderildi.");
35 | }
36 | }
37 |
38 | #endregion
39 |
40 | #region Nissan işlemleri için
41 |
42 | public class Nissan : BaseCar, ISmsSendable, IMailSendable, IMailMultipleSendable
43 | {
44 | public override double GetCostPerKM()
45 | {
46 | return 1.5;
47 | }
48 |
49 | public void SendInfoDriverEmail(DriverInfo info)
50 | {
51 | Console.WriteLine("Email gönderildi.");
52 | }
53 |
54 | public void SendInfoDriverEmails(List infos)
55 | {
56 | foreach (var item in infos)
57 | {
58 | Console.WriteLine($"Sürücü bilgisi: {item.EmailAdress}");
59 | }
60 | }
61 |
62 | public void SendInfoDriverSms(DriverInfo info)
63 | {
64 | Console.WriteLine("Sms gönderildi.");
65 |
66 | }
67 | }
68 |
69 | #endregion
70 |
71 |
72 | #region Yakıt Giderlerini Hesaplayan Bir Class
73 | public class FuelCostCalculator
74 | {
75 | public double Calculate(BaseCar car)
76 | {
77 | return car.RoadKm * car.GetCostPerKM();
78 | }
79 |
80 | }
81 | #endregion
82 |
83 | #region Base Car Abstract Class'ı ( Tekrar tekrar kod yazmadan kaçınmak için bir soyut sınıf açtık.)
84 | public abstract class BaseCar
85 | {
86 | public double RoadKm { get; set; } = 2.2;
87 |
88 | public abstract double GetCostPerKM();
89 | public void Go()
90 | {
91 | Console.WriteLine("Araba gidiyor..");
92 | }
93 |
94 | public void Stop()
95 | {
96 | Console.WriteLine("Araba durdu..");
97 | }
98 | }
99 |
100 | #endregion
101 |
102 | #region Interfacelerin Oluşturulması
103 | //SMS interface tanımlaması
104 | public interface ISmsSendable
105 | {
106 | void SendInfoDriverSms(DriverInfo info);
107 | }
108 |
109 | //Mail interface tanımlaması
110 |
111 | public interface IMailSendable
112 | {
113 | void SendInfoDriverEmail(DriverInfo info);
114 | }
115 |
116 | //Çoklu mail atımı için interface
117 | public interface IMailMultipleSendable
118 | {
119 | void SendInfoDriverEmails(List infos);
120 | }
121 |
122 | #endregion
123 |
124 | public class DriverInfo
125 | {
126 | public string EmailAdress { get; set; }
127 | public string Telephone { get; set; }
128 | public string City { get; set; }
129 | }
--------------------------------------------------------------------------------
/Uygulamalar/MSSQL Uygulamaları/data-manipulation-examples.sql:
--------------------------------------------------------------------------------
1 | --Select kullanımı
2 | select * from Products
3 |
4 | --Where koşulu kullanımı
5 | -- Id ilk kayıtlardan son kayıtlara doğru.
6 | select * from Products
7 | where UnitPrice > 53
8 | order by ProductID
9 |
10 | -- Id son kayıttan ilk kayıta doğru
11 | select * from Products
12 | where UnitPrice>53
13 | order by ProductID desc
14 |
15 | --Where koşulu ( üç condition,sıralama ve top ile sayı belirleme)
16 | select top 1 * from Products
17 | where UnitPrice>53 and UnitsInStock<42 and Discontinued =0
18 | order by ProductID desc
19 |
20 | -- Tablodaki kayıt sayısını getir.
21 | -- SQL kullanımında alians kavramı: as Urun_Sayisi
22 | select COUNT(*) as Urun_Sayisi from Products
23 | where UnitPrice>53 and UnitsInStock<42
24 |
25 | --Tablodaki ortalama fiyatı getirme
26 | select AVG(UnitPrice) as Ortalama_Fiyat from Products
27 |
28 | --Yuvarlama ortalama: Küsüratlı bir sayıyıyı yuvarlama işlemi
29 | select CEILING(AVG(UnitPrice)) from Products
30 |
31 | -- Tablodaki stock oranlarının toplamı getirme
32 | select SUM(UnitsInStock) as Stok_Toplam from Products
33 |
34 | --Tabloda aynı olan verilerin,tekrarlı bir şekilde gelmesini engelleyelim.
35 | -- DISTINCT
36 | select DISTINCT SupplierID from Products
37 |
38 | --Tabloda olmayan kayıtları getirsin.( Discontinued 0 olmayanları getir.)
39 | select * from Products
40 | where Discontinued!=0
41 |
42 | select * from Products
43 | where Discontinued<>0
44 |
45 | --Tablo içerisinde "x" değer içeren kayıtları getir. ( Proudt Name)
46 | -- Alice Mutton
47 | -- Alice ile başlayan, Alice ile biten ve içerisinde Alice geçen
48 |
49 | --Alice ile başlayan
50 | --Like komutundan yararlanılır.
51 |
52 | select * from Products
53 | where ProductName like 'Alice%'
54 |
55 | --Alice ile biten
56 | select * from Products
57 | where ProductName like '%Alice'
58 |
59 | -- İçerisinde ALice geçen
60 | select * from Products
61 | where ProductName like '%Alice%'
62 |
63 | -- İçerisinde Alice ile biten olmayan ( Not Like )
64 | select * from Products
65 | where ProductName NOT LIKE '%Alice'
66 |
67 |
68 | --Birden fazla kayıt için
69 | -- CategoryId 1 yada 2 yada 3 olanlar
70 | -- Or komutunu kullanırız.
71 |
72 | select * from Products
73 | where CategoryID =1 or CategoryID=2 or CategoryID=3
74 |
75 | --Or yerine IN de kullanabilirsiniz.
76 | select * from Products
77 | where CategoryID in(1,2,3)
78 |
79 | --UnitPrice'ı 18 ile 40 arasındaki kayıtları getirsin.
80 | select * from Products
81 | where UnitPrice>=18 and UnitPrice<=40
82 |
83 | --Between komutu da kullanılabilir.
84 | select * from Products
85 | where UnitPrice BETWEEN 18 and 40
86 |
87 | -- Insert Data Manipulation
88 | insert into TestTable(name,surname,age)
89 | values('kardel','test',18)
90 |
91 | --Kayıt eklenmiş mi kontrol et
92 | select * from TestTable
93 |
94 | --spesifik bir kayıt çek
95 | select * from TestTable
96 | where id= 1
97 |
98 | --Update Data Manipulation
99 | update TestTable
100 | set age = 17
101 | where id =1
102 |
103 | --Güncelleme gerçekleştirdikten sonra kontrol et
104 | select * from TestTable
105 | where id= 1
106 |
107 | --Delete Data Manipulation
108 | delete from TestTable
109 | where id =1
110 |
111 | -- Silme işlemin gerçekleştirdikten sonra kontrol et
112 | select * from TestTable
113 | where id= 2
114 |
115 |
116 |
117 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/AppDbContext.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.Models;
2 | using DotnetWorkshop.Repository.Configurations;
3 | using Microsoft.EntityFrameworkCore;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Reflection;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 |
11 | namespace DotnetWorkshop.Repository
12 | {
13 | public class AppDbContext:DbContext
14 | {
15 | public DbSet Teams { get; set; }
16 | public DbSet Users { get; set; }
17 | public DbSet UserProfiles { get; set; }
18 |
19 | public AppDbContext(DbContextOptions options) : base(options)
20 | {
21 |
22 | }
23 |
24 | public override int SaveChanges()
25 | {
26 | foreach (var item in ChangeTracker.Entries())
27 | {
28 | if (item.Entity is BaseEntity entityReference)
29 | {
30 | switch (item.State)
31 | {
32 | case EntityState.Modified:
33 | {
34 | entityReference.UpdatedDate = DateTime.Now;
35 | break;
36 | }
37 | case EntityState.Added:
38 | {
39 | entityReference.CreatedDate = DateTime.Now;
40 | entityReference.UpdatedDate = null;
41 | break;
42 | }
43 | }
44 | }
45 | }
46 | return base.SaveChanges();
47 | }
48 |
49 | public override Task SaveChangesAsync(CancellationToken cancellationToken = default)
50 | {
51 | foreach (var item in ChangeTracker.Entries())
52 | {
53 | if(item.Entity is BaseEntity entityReference)
54 | {
55 | switch (item.State)
56 | {
57 | case EntityState.Modified:
58 | {
59 | entityReference.UpdatedDate = DateTime.Now;
60 | break;
61 | }
62 | case EntityState.Added:
63 | {
64 | entityReference.CreatedDate = DateTime.Now;
65 | entityReference.UpdatedDate = null;
66 | break;
67 | }
68 | }
69 | }
70 | }
71 | return base.SaveChangesAsync(cancellationToken);
72 | }
73 | protected override void OnModelCreating(ModelBuilder modelBuilder)
74 | {
75 | //Aşağıdaki gibi de uygulayabilirsiniz ama pek önerilen bir kod değildir.
76 | //modelBuilder.ApplyConfiguration(new TeamConfiguration());
77 | //modelBuilder.ApplyConfiguration(new UserConfiguration());
78 | //modelBuilder.ApplyConfiguration(new UserProfileConfiguration());
79 |
80 | //Assembly içinde bulunan tüm Fluent API Konfigürasyon sınıflarını çalıştır.
81 | modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
82 | base.OnModelCreating(modelBuilder);
83 | }
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Service/Authorization/Concrete/JwtAuthenticationManager.cs:
--------------------------------------------------------------------------------
1 | using DotnetWorkshop.Core.DTOs;
2 | using DotnetWorkshop.Service.Authorization.Abstract;
3 | using DotnetWorkshop.Service.Helpers;
4 | using Microsoft.Extensions.Options;
5 | using Microsoft.IdentityModel.Tokens;
6 | using System;
7 | using System.Collections.Generic;
8 | using System.IdentityModel.Tokens.Jwt;
9 | using System.Linq;
10 | using System.Security.Claims;
11 | using System.Text;
12 | using System.Threading.Tasks;
13 |
14 | namespace DotnetWorkshop.Service.Authorization.Concrete
15 | {
16 | public class JwtAuthenticationManager : IJwtAuthenticationManager
17 | {
18 | private readonly AppSettings _appSettings;
19 |
20 | public JwtAuthenticationManager(IOptions appSettings)
21 | {
22 | _appSettings = appSettings.Value;
23 | }
24 | public AuthResponseDto Authenticate(string userName, string password)
25 | {
26 | AuthResponseDto authResponse = new AuthResponseDto();
27 |
28 | try
29 | {
30 | var tokenHandler = new JwtSecurityTokenHandler();
31 | var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
32 |
33 | var tokenDescriptor = new SecurityTokenDescriptor
34 | {
35 | Expires = DateTime.UtcNow.AddHours(1),
36 | Subject = new ClaimsIdentity(new Claim[]
37 | {
38 | new Claim(ClaimTypes.Name,userName)
39 | }),
40 | SigningCredentials = new SigningCredentials(
41 | new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
42 | };
43 |
44 |
45 | var token = tokenHandler.CreateToken(tokenDescriptor);
46 | authResponse.Token = tokenHandler.WriteToken(token);
47 |
48 | return authResponse;
49 | }
50 | catch (Exception)
51 | {
52 | return authResponse;
53 | }
54 |
55 | }
56 | public int? ValidateJwtToken(string token)
57 | {
58 | if (token == null)
59 | return null;
60 |
61 | var tokenHandler = new JwtSecurityTokenHandler();
62 | var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
63 | try
64 | {
65 | tokenHandler.ValidateToken(token, new TokenValidationParameters
66 | {
67 | ValidateIssuerSigningKey = true,
68 | IssuerSigningKey = new SymmetricSecurityKey(key),
69 | ValidateIssuer = false,
70 | ValidateAudience = false,
71 | // set clockskew to zero so tokens expire exactly at token expiration time (instead of 5 minutes later)
72 | ClockSkew = TimeSpan.Zero
73 | }, out SecurityToken validatedToken);
74 |
75 | var jwtToken = (JwtSecurityToken)validatedToken;
76 | var userId = int.Parse(jwtToken.Claims.First(x => x.Type == "id").Value);
77 |
78 | // return user id from JWT token if validation successful
79 | return userId;
80 | }
81 | catch
82 | {
83 | // return null if validation fails
84 | return null;
85 | }
86 | }
87 |
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ### Herkese Merhabalar !
2 |
3 | Sektör Kampüste Programı, çalışma alanları doğrultusunda güncel bilgilerle donatılmış insan kaynağı yetiştirmek için firmalar tarafından üniversitelerde MTH koduyla kredili olarak açılan uzaktan senkron dersleri kapsamaktadır.
4 | Bu program kapsamında Ankara Üniversitesi'nde 1317MTHG01/MTH-24-31 kodlu, Bursa Uludağ Üniversitesi'nde MTH3021 kodlu, Kütahya Dumlupınar Üniversitesi'nde ise 1317MTHG01/MTH-24-31 kodlu Modern Web Geliştirme Temelleri dersini vermekteyim. Bu ders kapsamında amacım öğrencileri sektöre hazırlamak, üniversitede
5 | aldığı derslerin sektörde nasıl uygulanacağına dair pratikler gerçekleştirmek ve öğrencilerin kendine en uygun alanı bulabilmelerini hedeflemektir.
6 |
7 |
8 |
9 | -> Ders notlarına aşağıdaki yönlendirmelerden ulaşabilirsiniz.
10 |
11 | - [x] [Ben Kimim?](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/ben-kimim.md)
12 | - [x] [Modern Web Geliştirme- Notlar 1-IT'ye Giriş](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/modern-web-gelistirme-1.md)
13 | - [x] [Modern Web Geliştirme- Notlar 2-Agile Proje Yönetimi](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/modern-web-gelistirme-2.md)
14 | - [x] [Modern Web Geliştirme- Notlar 3-Versiyon Kontrol Sistemleri-Git](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/modern-web-gelistirme-3.md)
15 | - [x] [Modern Web Geliştirme- Notlar 4-Veri Tabanı Temelleri](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/modern-web-gelistirme-4.md)
16 | - [x] [Modern Web Geliştirme- Notlar 5-MSSQL Uygulamaları](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/modern-web-gelistirme-5.md)
17 | - [x] [Modern Web Geliştirme- Notlar 6-C# Temelleri](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/modern-web-gelistirme-6.md)
18 | - [x] [Modern Web Geliştirme- Notlar 7-C# 102](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/modern-web-gelistirme-7.md)
19 | - [x] [Modern Web Geliştirme- Notlar 8-Solid](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/modern-web-gelistirme-8.md)
20 | - [x] [Modern Web Geliştirme- Notlar 9-.Net Ekosistemi](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/modern-web-gelistirme-9.md)
21 | - [x] [Modern Web Geliştirme- Notlar 10-.Net Core Temelleri](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/modern-web-gelistirme-10.md)
22 | - [x] [Modern Web Geliştirme- Notlar 11-.Net Core Best Practices](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/modern-web-gelistirme-11.md)
23 | - [x] [Modern Web Geliştirme- Notlar 12- Monolitik Mimari Nedir? SOA Nedir? Mikroservis Mimarisi nedir?](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/modern-web-gelistirme-12.md)
24 | - [x] [Modern Web Geliştirme- Notlar 13-.N-Layer Proje Yapısı](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/modern-web-gelistirme-13.md)
25 | - [ ] [Modern Web Geliştirme- Notlar 14-Core Katmanı Geliştirmeleri](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/modern-web-gelistirme-14.md)
26 |
27 |
28 | [Modern Web Geliştirme-FAYDALI KAYNAKLAR](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/faydaliKaynaklar.md)
29 |
30 |
31 | [Modern Web Geliştirme- ÖDEVLENDİRMELER](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/blob/master/odevlendirme.md)
32 | 
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/odevlendirme.md:
--------------------------------------------------------------------------------
1 | ## Modern Web Geliştirme Ödevlendirmeler(Ankara Üniversitesi & Uludağ Üniversitesi)
2 |
3 | ## Ödev 1- Versiyon Kontrol Sistemleri(Git)
4 |
5 | - Bir tane dosya oluşturacaksınız.
6 | - Bu dosyanın içerisinde **modern-web-gelistirme.txt** ( bir dosya oluşturcaksınız.)
7 | - **modern-web-gelistirme.txt** içerisinde okul numaranız-ad-soyad yer alsın.
8 | - git versiyon kontrol sistemini bilgisayarlarınıza kurmanız gerekiyor. ( Notlarda kurulum aşamaları mevcut.)
9 |
10 | Oluşturduğunuz dosya dizinine git'i entegre etmenizi istiyorum.
11 |
12 | - git init ( boş bir local repo oluşturmak için )
13 | - git status ( ne gibi değişiklikler yaptığınız görmek için )
14 | - git add . , git add modern-web-gelistirme.txt
15 | - git status (stage tarafına geçtiğini göstereceksiniz.)
16 | - git commit -m kullanılırak commit mesajı attığını göstermenizi istiyorum.
17 | - git status ( working tree clean ) mesajını almanızı bekliyorum.
18 |
19 |
20 |
21 | -> Her aşamanın ekran görüntüleriyle bir word dokumantasyonunda oluşturup bana **Pazartesi** akşamına kadar iletmenizi istiyorum. ( Ankara Universitesi )
22 |
23 |
24 | -> Her aşamanın ekran görüntüleriyle bir word dokumantasyonunda oluşturup bana **Çarşamba** akşamına kadar iletmenizi istiyorum. ( Uludağ Universitesi )
25 |
26 |
27 | -> Her aşamada ekran görüntülerini alıp yorum yapmanız değerli olacaktır.
28 |
29 |
30 | -> Sorun yaşayan arkadaşlar Pazartesi gününe kadar benle iletişime geçip hatalarını da gösterebilirler.
31 |
32 | -> Ödevlerinizi **ruveydakardelcetin@gmail.com** adresine iletebilirsiniz.
33 |
34 | -> Ders notlarının devamını ekleyeceğim, haftaya o notları okuyup gelirsek üzerinden geçip bir sonraki konuya devam edeceğiz.
35 |
36 |
37 | ## Ödev 2- Versiyon Kontrol Sistemleri(Git)
38 |
39 | ### İlk Kısım
40 |
41 | - Working Directory'de bir dosya oluşturun.
42 | - Bu dosyada herhangi bir değişiklik yapın.
43 | - Bu değişikliği Working Directory'den -> Staging Area'ya doğru aktarın.
44 | - Sonrasında Stage'ye eklenmiş değişikliği geri alarak tekrar Working Directory dizinine dönün.
45 | - Sonrasında da Working Directory dizinindeki değişikliği de tekrar geri alarak, herhangi bir değişiklik yapmadığınız duruma dönün.
46 |
47 |
48 | ### İkinci Kısım
49 | - Repository üzerinden son üç logu getirecek git komutunu yazınız.
50 | - Repository üzerinden son 15 dakika içerisindeki logu getirecek git komutunu yazınız.
51 | - Logları tek satırda gösterebileceğiniz komutu yazınız.
52 |
53 |
54 | ### Üçüncü Kısım
55 | - Local ortamınızdaki branchleri listeleyin.
56 | - Kendi branchinizi oluşturun.
57 | - Kendi branchinize git komut satırıyla geçi yapın.
58 |
59 | ### Dördüncü Kısım
60 | - Github üzerinde (benim projelerim de olabilir,farklı projeler de olabilir.) bir repo seçin.
61 | - Bu repoyu kendi localinize ( yani bilgisayarınıza) çekmek için uygun git komutunu kullanın.
62 |
63 |
64 | ### Beşinci Kısım
65 | - Boş bir klasör oluşturunuz.
66 | - Bu klasör içerisinde github.txt bir dosya ekleyiniz. Bu dosya içerisine "test" yazabilirsiniz.
67 | - Bu projeyi git ile izlemeye alın.
68 | - Gerekli işlemleri yaptıktan sonra github repository oluşturun.
69 | - Localinizdeki bu değişilkleri uzak repoya aktarın.
70 | - Bu çalışmaları yaptıktan ve ekran görüntülerini aldıktan sonra repository'i silebilirsiniz.
71 |
72 | ### Ödevlerin Detayları
73 | - Her aşamanın ekran görüntüleriyle bir word dokumantasyonunda oluşturup bana Pazartesi akşamına kadar iletmenizi istiyorum. ( Ankara Universitesi )
74 | - Her aşamanın ekran görüntüleriyle bir word dokumantasyonunda oluşturup bana Çarşamba akşamına kadar iletmenizi istiyorum. ( Uludağ Universitesi )
75 | - Her aşamada ekran görüntülerini alıp yorum yapmanız değerli olacaktır.
76 | - Sorun yaşayan arkadaşlar Pazartesi gününe kadar benle iletişime geçip hatalarını da gösterebilirler.
77 | - Ödevlerinizi ruveydakardelcetin@gmail.com adresine iletebilirsiniz.
78 | - Ödevlerinizi word dokümantasyonu şeklinde de oluşturabilirsiniz veya bir medium makalesi yazarak bana linkini de
79 | paylaşabilirsiniz
80 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Service/Services/UserService.cs:
--------------------------------------------------------------------------------
1 | using AutoMapper;
2 | using DotnetWorkshop.Core.DTOs;
3 | using DotnetWorkshop.Core.Models;
4 | using DotnetWorkshop.Core.Repositories;
5 | using DotnetWorkshop.Core.Services;
6 | using DotnetWorkshop.Core.UnitOfWorks;
7 | using DotnetWorkshop.Service.Authorization.Abstract;
8 | using System;
9 | using System.Collections.Generic;
10 | using System.Linq;
11 | using System.Security.Cryptography;
12 | using System.Text;
13 | using System.Threading.Tasks;
14 |
15 | namespace DotnetWorkshop.Service.Services
16 | {
17 | public class UserService : Service, IUserService
18 | {
19 | private readonly IMapper _mapper;
20 | private readonly IGenericRepository _repository;
21 | private readonly IJwtAuthenticationManager _jwtAuthenticationManager;
22 | public UserService(IGenericRepository repository, IUnitOfWork unitOfWork, IMapper mapper, IJwtAuthenticationManager jwtAuthenticationManager) : base(repository, unitOfWork)
23 | {
24 | _mapper = mapper;
25 | _repository = repository;
26 | _jwtAuthenticationManager = jwtAuthenticationManager;
27 | }
28 |
29 | public string GeneratePasswordHash(string userName, string password)
30 | {
31 | if (string.IsNullOrEmpty(userName))
32 | {
33 | throw new ArgumentNullException(nameof(userName));
34 | }
35 |
36 | if (string.IsNullOrEmpty(password))
37 | {
38 | throw new ArgumentNullException(nameof(userName));
39 | }
40 |
41 | byte[] userBytes = Encoding.UTF8.GetBytes(userName);
42 | string userByteString = Convert.ToBase64String(userBytes);
43 | string smallByteString = $"{userByteString.Take(2)}.{userByteString.Reverse().Take(2)}";
44 | byte[] smallBytes = Encoding.UTF8.GetBytes(smallByteString);
45 | byte[] passBytes = Encoding.UTF8.GetBytes(password);
46 |
47 | byte[] hashed = this.GenerateSaltedHash(passBytes, smallBytes);
48 |
49 | return Convert.ToBase64String(hashed);
50 | }
51 |
52 | private byte[] GenerateSaltedHash(byte[] plainText, byte[] salt)
53 | {
54 | HashAlgorithm algorithm = new SHA256Managed();
55 |
56 | byte[] plainTextWithSaltBytes =
57 | new byte[plainText.Length + salt.Length];
58 |
59 | for (int i = 0; i < plainText.Length; i++)
60 | {
61 | plainTextWithSaltBytes[i] = plainText[i];
62 | }
63 | for (int i = 0; i < salt.Length; i++)
64 | {
65 | plainTextWithSaltBytes[plainText.Length + i] = salt[i];
66 | }
67 |
68 | return algorithm.ComputeHash(plainTextWithSaltBytes);
69 | }
70 |
71 | public UserDto FindUser(string userName, string password)
72 | {
73 | string passHashed = GeneratePasswordHash(userName, password);
74 | var user = _repository.Where(x => x.UserName == userName && x.Password == passHashed).FirstOrDefault();
75 | var userDto = _mapper.Map(user);
76 | return userDto;
77 | }
78 |
79 | public AuthResponseDto Login(AuthRequestDto request)
80 | {
81 | AuthResponseDto responseDto = new AuthResponseDto();
82 |
83 | UserDto user = FindUser(request.UserName, request.Password);
84 | responseDto = _jwtAuthenticationManager.Authenticate(request.UserName, request.Password);
85 | responseDto.User = user;
86 |
87 | return responseDto;
88 | }
89 |
90 | public UserDto SignUp(AuthRequestDto request)
91 | {
92 | #region Password'u Hashle
93 | var passwordHash = GeneratePasswordHash(request.UserName, request.Password);
94 | #endregion
95 |
96 | var user = AddAsync(new User
97 | {
98 | Email = request.Email,
99 | UserName = request.UserName,
100 | Password = passwordHash,
101 | TeamId = 1
102 | });
103 |
104 | var userDto = _mapper.Map(user);
105 |
106 | return userDto;
107 | }
108 |
109 | public UserDto GetByUserName(string userName)
110 | {
111 | var user = _repository.Where(x => x.UserName == userName).FirstOrDefault();
112 | var userDto = _mapper.Map(user);
113 | return userDto;
114 | }
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/modern-web-gelistirme-9.md:
--------------------------------------------------------------------------------
1 | # .NET Ekosistemi
2 |
3 | .NET, birçok tür uygulama oluşturmaya yönelik ücretsiz, platformlar arası, açık kaynak bir geliştirici platformudur . .NET, birçok yüksek ölçekli uygulama tarafından üretimde kullanılan yüksek performanslı bir çalışma zamanı üzerine kurulmuştur.
4 |
5 | ## Bulut uygulamaları
6 |
7 | - Bulutta yerel uygulamalar
8 | - .NET Aspire
9 | - Konsol uygulamaları
10 | - Bulutta sunucusuz işlevler
11 | - Web uygulamaları, web API'leri ve mikro hizmetler
12 |
13 | ## Windows uygulamaları
14 | - Windows Masaüstü uygulamaları(Windows Forms,Windows WPF)
15 | - Evrensel Windows Platformu (UWP)
16 | - Windows hizmetleri
17 |
18 | ## .NET Özellikleri
19 | - Asynchronous code
20 | - Attributes
21 | - Reflection
22 | - Code analyzers
23 | - Representatives and lambda expressions
24 | - Events
25 | - Special cases
26 | - Garbage collection
27 | - General Species
28 | - LINQ (Language Integrated Query).
29 | - Parallel programming and Managed threading
30 | - Type inference - C#, F#, Visual Basic.
31 | - Type system
32 | - Unsecured code
33 |
34 | ## .NET kullanma
35 |
36 | .NET uygulamaları ve kitaplıkları, .NET CLI veya Visual Studio gibi bir Tümleşik Geliştirme Ortamı (IDE) kullanılarak kaynak koddan ve proje dosyasından oluşturulur.
37 |
38 | 
39 | 
40 |
41 |
42 | - **.NET SDK:** Geliştirme, derleme ve test uygulamaları için araçlar, kitaplıklar ve çalışma zamanları kümesi.
43 | - **.NET Çalışma Zamanları:** Uygulamaları çalıştırmak için çalışma zamanı ve kitaplık kümesi.
44 |
45 | ## Ücretsiz ve açık kaynak
46 |
47 | NET ücretsiz, açık kaynak ve bir .NET Foundation projesidir. .NET, Microsoft ve GitHub'daki topluluk tarafından çeşitli depolarda tutulur. .NET kaynağı ve ikili dosyaları MIT lisansıyla lisanslandırılır. İkili dağıtımlar için Windows'ta ek lisanslar geçerlidir.
48 |
49 | ## Desteklenen Diller
50 |
51 | Çalışma zamanı, birden çok programlama dilini destekleyecek şekilde tasarlanmıştır. C#, F# ve Visual Basic dilleri Microsoft tarafından desteklenir ve toplulukla işbirliği içinde tasarlanmıştır.
52 |
53 | - **C#** modern, nesne odaklı ve tür açısından güvenli bir programlama dilidir. C dil ailesine kökenleri vardır ve C, C++, Java ve JavaScript programcılarına hemen aşina olacaktır.
54 | - **F#** kısa, sağlam ve performanslı kod yazmaya yönelik birlikte çalışabilen bir programlama dilidir. F# programlama, kodun işlevlerle veri dönüştürmeyi içerdiği veri odaklıdır.
55 | - **Visual Basic** , sıradan bir insan diline daha yakın olan daha ayrıntılı bir söz dizimi kullanır. Programlamaya yeni yeni gelen kişiler için öğrenmesi daha kolay bir dil olabilir.
56 |
57 | ## Nuget Paket Yöneticisi
58 |
59 | NuGet , .NET için paket yöneticisidir. Geliştiricilerin derlenmiş ikili dosyaları birbirleriyle paylaşmasına olanak tanır. NuGet.org topluluktan birçok popüler paket sunar.
60 |
61 | ## .NET geçmişi
62 |
63 | - 2002'de Microsoft, Windows uygulamaları oluşturmaya yönelik bir geliştirme platformu olan .NET Framework'i yayımladı. Bugün .NET Framework 4.8 sürümündedir ve Microsoft tarafından tam olarak desteklenmektedir.
64 | - 2014'te Microsoft, .NET Framework'ün açık kaynak ardılı olarak .NET Core'u platformlar arası bir hale getirerek kullanıma sunmaçtaydı. .NET'in bu yeni uygulaması sürüm 3.1'e kadar .NET Core adını korudu. .NET Core 3.1'den sonraki sürüm adın "Core" bölümünü bıraktı ve .NET 5 olarak adlandırıldı.
65 | - Yeni .NET sürümleri, her birinin ana sürüm numarası daha yüksek olmak üzere yıllık olarak yayınlanmaya devam ediyor. Bunlar önemli yeni özellikler içerir ve genellikle yeni senaryoları etkinleştirir.
66 |
67 | ## .NET ekosistemi
68 |
69 | Her biri farklı bir uygulama türünü destekleyen birden çok .NET değişkeni vardır. Birden çok çeşidin nedeni kısmen geçmiş, kısmen tekniktir.
70 |
71 | _**Microsoft'un desteklediği dört .NET uygulaması vardır:**_
72 |
73 | - NET 6 ve sonraki sürümleri
74 | - .NET Framework
75 | - Mono
76 | - UWP
77 |
78 | Daha önce .NET Core olarak adlandırılan .NET şu anda birincil uygulamadır. .NET (8), Windows masaüstü uygulamaları ve platformlar arası konsol uygulamaları, bulut hizmetleri ve web siteleri gibi birden çok platformu ve çok sayıda iş yükünü destekleyen tek bir kod tabanında oluşturulur. .NET WebAssembly derleme araçları gibi bazı iş yükleri isteğe bağlı yüklemeler olarak kullanılabilir.
79 |
80 | **.NET uygulamaları (geçmiş sırası):**
81 |
82 | **.NET Framework**
83 |
84 | .NET Framework, 2002'den beri var olan özgün .NET uygulamasıdır. Sürüm 4.5 ve üzeri .NET Standard'ı uyguladığından, .NET Standard'ı hedefleyen kod bu .NET Framework sürümlerinde çalıştırılabilir. Windows Forms ve WPF ile Windows masaüstü geliştirme API'leri gibi Windows'a özgü ek API'ler içerir. .NET Framework, Windows masaüstü uygulamaları oluşturmak için iyileştirilmiştir.
85 |
86 | **Mono**
87 |
88 | Mono, çoğunlukla küçük bir çalışma zamanı gerektiğinde kullanılan bir .NET uygulamasıdır. Android, macOS, iOS, tvOS ve watchOS'ta Xamarin uygulamalarını destekleyen ve öncelikli olarak küçük bir ayak izine odaklanan çalışma zamanıdır. Mono, Unity altyapısı kullanılarak oluşturulan oyunları da destekler. Şu anda yayımlanmış olan tüm .NET Standard sürümlerini destekler. Mono, geçmişte daha büyük .NET Framework API'sini uyguladı ve Unix'te en popüler özelliklerden bazılarını taklit etti. Bazen Unix'te bu özelliklere dayanan .NET uygulamalarını çalıştırmak için kullanılır. Mono genellikle tam zamanında derleyici ile kullanılır, ancak aynı zamanda iOS gibi platformlarda kullanılan tam statik derleyici (önceden derleme) içerir.
89 |
90 | **.NET (Core)**
91 |
92 | .NET'in platformlar arası ve açık kaynak uygulaması, bulut çağı için yeniden kullanılırken .NET Framework ile önemli ölçüde uyumlu kalır. Linux, macOS ve Windows uygulamaları için kullanılır.
93 |
94 | **.NET 5 ve sonraki sürümleri**
95 |
96 | _.NET 8, bu .NET uygulamasının en son sürümüdür._
97 |
98 | _Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:_
99 |
100 | - .NET'e giriş
101 | - Sunucu uygulamaları için .NET ve .NET Framework karşılaştırması
102 | - .NET 5+ ve .NET Standard
103 |
104 | Daha önce .NET Core olarak adlandırılan .NET, sunucu ve bulut iş yüklerini büyük ölçekte işlemek için tasarlanmış platformlar arası bir uygulamadır. Masaüstü uygulamaları da dahil olmak üzere diğer iş yüklerini de destekler. Windows, macOS ve Linux üzerinde çalışır. .NET Standard'ı hedefleyen kodun .NET üzerinde çalışabilmesi için .NET Standard'ı uygular. ASP.NET Core, Windows Forms ve Windows Presentation Foundation (WPF) .NET üzerinde çalışır.
105 |
106 | ### Kaynakça
107 | https://learn.microsoft.com/tr-tr/dotnet/core/introduction
108 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/Migrations/20240209184236_initial.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Microsoft.EntityFrameworkCore.Migrations;
3 |
4 | #nullable disable
5 |
6 | namespace DotnetWorkshop.Repository.Migrations
7 | {
8 | public partial class initial : Migration
9 | {
10 | protected override void Up(MigrationBuilder migrationBuilder)
11 | {
12 | migrationBuilder.CreateTable(
13 | name: "Teams",
14 | columns: table => new
15 | {
16 | Id = table.Column(type: "int", nullable: false)
17 | .Annotation("SqlServer:Identity", "1, 1"),
18 | TeamName = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false),
19 | CreatedDate = table.Column(type: "datetime2", nullable: false),
20 | UpdatedDate = table.Column(type: "datetime2", nullable: true)
21 | },
22 | constraints: table =>
23 | {
24 | table.PrimaryKey("PK_Teams", x => x.Id);
25 | });
26 |
27 | migrationBuilder.CreateTable(
28 | name: "Users",
29 | columns: table => new
30 | {
31 | Id = table.Column(type: "int", nullable: false)
32 | .Annotation("SqlServer:Identity", "1, 1"),
33 | UserName = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false),
34 | Email = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false),
35 | Password = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false),
36 | TeamId = table.Column(type: "int", nullable: false),
37 | CreatedDate = table.Column(type: "datetime2", nullable: false),
38 | UpdatedDate = table.Column(type: "datetime2", nullable: true)
39 | },
40 | constraints: table =>
41 | {
42 | table.PrimaryKey("PK_Users", x => x.Id);
43 | table.ForeignKey(
44 | name: "FK_Users_Teams_TeamId",
45 | column: x => x.TeamId,
46 | principalTable: "Teams",
47 | principalColumn: "Id",
48 | onDelete: ReferentialAction.Cascade);
49 | });
50 |
51 | migrationBuilder.CreateTable(
52 | name: "UserProfiles",
53 | columns: table => new
54 | {
55 | Id = table.Column(type: "int", nullable: false)
56 | .Annotation("SqlServer:Identity", "1, 1"),
57 | FirstName = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false),
58 | LastName = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false),
59 | UserId = table.Column(type: "int", nullable: false)
60 | },
61 | constraints: table =>
62 | {
63 | table.PrimaryKey("PK_UserProfiles", x => x.Id);
64 | table.ForeignKey(
65 | name: "FK_UserProfiles_Users_UserId",
66 | column: x => x.UserId,
67 | principalTable: "Users",
68 | principalColumn: "Id",
69 | onDelete: ReferentialAction.Cascade);
70 | });
71 |
72 | migrationBuilder.InsertData(
73 | table: "Teams",
74 | columns: new[] { "Id", "CreatedDate", "TeamName", "UpdatedDate" },
75 | values: new object[] { 1, new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), "Takım 1", null });
76 |
77 | migrationBuilder.InsertData(
78 | table: "Teams",
79 | columns: new[] { "Id", "CreatedDate", "TeamName", "UpdatedDate" },
80 | values: new object[] { 2, new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), "Takım 2", null });
81 |
82 | migrationBuilder.InsertData(
83 | table: "Teams",
84 | columns: new[] { "Id", "CreatedDate", "TeamName", "UpdatedDate" },
85 | values: new object[] { 3, new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), "Takım 3", null });
86 |
87 | migrationBuilder.InsertData(
88 | table: "Users",
89 | columns: new[] { "Id", "CreatedDate", "Email", "Password", "TeamId", "UpdatedDate", "UserName" },
90 | values: new object[] { 1, new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), "test1@gmail.com", "123123", 1, null, "test1" });
91 |
92 | migrationBuilder.InsertData(
93 | table: "Users",
94 | columns: new[] { "Id", "CreatedDate", "Email", "Password", "TeamId", "UpdatedDate", "UserName" },
95 | values: new object[] { 2, new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), "test2@gmail.com", "134134", 2, null, "test2" });
96 |
97 | migrationBuilder.InsertData(
98 | table: "Users",
99 | columns: new[] { "Id", "CreatedDate", "Email", "Password", "TeamId", "UpdatedDate", "UserName" },
100 | values: new object[] { 3, new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), "test3@gmail.com", "354565", 3, null, "test3" });
101 |
102 | migrationBuilder.InsertData(
103 | table: "UserProfiles",
104 | columns: new[] { "Id", "FirstName", "LastName", "UserId" },
105 | values: new object[] { 1, "Test 1", "Test test 1", 1 });
106 |
107 | migrationBuilder.InsertData(
108 | table: "UserProfiles",
109 | columns: new[] { "Id", "FirstName", "LastName", "UserId" },
110 | values: new object[] { 2, "Test 2", "Test test 2", 2 });
111 |
112 | migrationBuilder.InsertData(
113 | table: "UserProfiles",
114 | columns: new[] { "Id", "FirstName", "LastName", "UserId" },
115 | values: new object[] { 3, "Test 3", "Test test 3", 3 });
116 |
117 | migrationBuilder.CreateIndex(
118 | name: "IX_UserProfiles_UserId",
119 | table: "UserProfiles",
120 | column: "UserId");
121 |
122 | migrationBuilder.CreateIndex(
123 | name: "IX_Users_TeamId",
124 | table: "Users",
125 | column: "TeamId");
126 | }
127 |
128 | protected override void Down(MigrationBuilder migrationBuilder)
129 | {
130 | migrationBuilder.DropTable(
131 | name: "UserProfiles");
132 |
133 | migrationBuilder.DropTable(
134 | name: "Users");
135 |
136 | migrationBuilder.DropTable(
137 | name: "Teams");
138 | }
139 | }
140 | }
141 |
--------------------------------------------------------------------------------
/Uygulamalar/MSSQL Uygulamaları/sql-examples.md:
--------------------------------------------------------------------------------
1 | # Northwind Veritabanında INNER JOIN ve GROUP BY Kullanımı
2 |
3 | Bu dosyada, **Northwind** veritabanını kullanarak örnekler gerçekleştirilmiştir.
4 |
5 |
6 | ## Senaryo 1
7 |
8 | * Her bir ürünün kategori adını ve tedarikçi adını getiren bir sorgu oluşturun.
9 | * Products tablosu **Categories** ve **Suppliers** tablolarıyla birleştirildi.
10 | * Bu sorgu, her ürünün adı, kategori adı ve tedarikçi adını getirir.
11 |
12 | ```sql
13 | SELECT
14 | Products.ProductName,
15 | Categories.CategoryName,
16 | Suppliers.CompanyName AS SupplierName
17 | FROM
18 | Products
19 | INNER JOIN
20 | Categories ON Products.CategoryID = Categories.CategoryID
21 | INNER JOIN
22 | Suppliers ON Products.SupplierID = Suppliers.SupplierID;
23 |
24 |
25 | ```
26 |
27 | ## Senaryo 2
28 |
29 | * Her müşterinin verdiği siparişleri ve bu siparişlerde yer alan ürünleri listeleyin.
30 | * **Customers** tablosu **Orders** ile, **Orders** tablosu **Order_Details** ile ve **Order_Details** tablosu **Products** ile birleştirildi.
31 | * Sorgu, müşteri adı, sipariş kimliği, siparişte yer alan ürün adı, miktarı ve birim fiyatını listeler.
32 |
33 | ```sql
34 | SELECT
35 | Customers.CustomerID,
36 | Customers.CompanyName AS CustomerName,
37 | Orders.OrderID,
38 | Products.ProductName,
39 | Order_Details.Quantity,
40 | Order_Details.UnitPrice
41 | FROM
42 | Customers
43 | INNER JOIN
44 | Orders ON Customers.CustomerID = Orders.CustomerID
45 | INNER JOIN
46 | Order_Details ON Orders.OrderID = Order_Details.OrderID
47 | INNER JOIN
48 | Products ON Order_Details.ProductID = Products.ProductID;
49 |
50 | ```
51 |
52 | ## Senaryo 3: Çalışanların Sattığı Ürünler ve Sipariş Bilgileri
53 |
54 | * Her çalışanın sattığı ürünleri, sipariş tarihini ve ürünlerin toplam tutarını listeleyin.
55 | * **Employees**, **Orders**, **Order_Details** ve **Products** tabloları birbirine bağlandı.
56 | * Sorgu, çalışan adı, sipariş kimliği, sipariş tarihi, ürün adı, miktarı, birim fiyatı ve toplam tutarı listeler.
57 |
58 |
59 |
60 | ```sql
61 | SELECT
62 | Employees.EmployeeID,
63 | Employees.FirstName + ' ' + Employees.LastName AS EmployeeName,
64 | Orders.OrderID,
65 | Orders.OrderDate,
66 | Products.ProductName,
67 | Order_Details.Quantity,
68 | Order_Details.UnitPrice,
69 | (Order_Details.Quantity * Order_Details.UnitPrice) AS TotalAmount
70 | FROM
71 | Employees
72 | INNER JOIN
73 | Orders ON Employees.EmployeeID = Orders.EmployeeID
74 | INNER JOIN
75 | Order_Details ON Orders.OrderID = Order_Details.OrderID
76 | INNER JOIN
77 | Products ON Order_Details.ProductID = Products.ProductID;
78 |
79 | ```
80 |
81 | ## Senaryo 4: En Çok Satılan Ürünler
82 |
83 | * Her ürün için toplam satış miktarını hesaplayın ve en çok satılan ürünleri azalan sırayla listeleyin.
84 | * **Products** ve **Order_Details** tabloları birleştirildi.
85 | * Her ürün için toplam satış miktarı hesaplandı ve en çok satılandan en aza doğru sıralandı.
86 |
87 |
88 | ```sql
89 | SELECT
90 | Products.ProductID,
91 | Products.ProductName,
92 | SUM(Order_Details.Quantity) AS TotalQuantitySold
93 | FROM
94 | Products
95 | INNER JOIN
96 | Order_Details ON Products.ProductID = Order_Details.ProductID
97 | GROUP BY
98 | Products.ProductID, Products.ProductName
99 | ORDER BY
100 | TotalQuantitySold DESC;
101 | ```
102 |
103 | ## Senaryo 5: Müşterilerin Tedarikçilerden Aldığı Ürünlerin Detayları
104 |
105 | * Müşterilerin tedarikçilerden aldığı ürünleri, sipariş tarihi, tedarikçi adı ve ürün fiyatıyla birlikte listeleyin.
106 | * **Customers**, **Orders**, **Order_Details**, **Products** ve **Suppliers** tabloları birbirine bağlandı.
107 | * Sorgu, müşterilerin sipariş verdiği ürünleri, tedarikçi adı, sipariş tarihi, miktar ve birim fiyat bilgisiyle birlikte listeleyerek detay sağlar.
108 |
109 |
110 | ```sql
111 | SELECT
112 | Customers.CustomerID,
113 | Customers.CompanyName AS CustomerName,
114 | Suppliers.CompanyName AS SupplierName,
115 | Products.ProductName,
116 | Orders.OrderDate,
117 | Order_Details.Quantity,
118 | Order_Details.UnitPrice
119 | FROM
120 | Customers
121 | INNER JOIN
122 | Orders ON Customers.CustomerID = Orders.CustomerID
123 | INNER JOIN
124 | Order_Details ON Orders.OrderID = Order_Details.OrderID
125 | INNER JOIN
126 | Products ON Order_Details.ProductID = Products.ProductID
127 | INNER JOIN
128 | Suppliers ON Products.SupplierID = Suppliers.SupplierID;
129 | ```
130 |
131 | ## Senaryo 6 Kategorilere Göre Toplam Satış Miktarını Hesaplama
132 |
133 | * Her bir kategoriye ait toplam satış miktarını (ürün sayısını) bulmak için GROUP BY ve SUM ifadelerini kullanabilirsiniz.
134 | * **Categories** ve **Products** tabloları, ardından **Order_Details** tablosu ile **INNER JOIN** kullanılarak bağlandı
135 | * GROUP BY ifadesi ile her kategoriye göre gruplama yapılır ve SUM(Order_Details.Quantity) ile her kategorideki toplam satış miktarı hesaplanır.
136 |
137 |
138 |
139 |
140 | ```sql
141 | SELECT
142 | Categories.CategoryName,
143 | SUM(Order_Details.Quantity) AS TotalQuantitySold
144 | FROM
145 | Categories
146 | INNER JOIN
147 | Products ON Categories.CategoryID = Products.CategoryID
148 | INNER JOIN
149 | Order_Details ON Products.ProductID = Order_Details.ProductID
150 | GROUP BY
151 | Categories.CategoryName;
152 |
153 | ```
154 |
155 |
156 | ## ÖDEV: Müşterilerin Toplam Sipariş Tutarlarını Hesaplama
157 |
158 | Görev Tanımı: Northwind veritabanını kullanarak, her müşterinin verdiği siparişlerin toplam tutarını hesaplayan bir SQL sorgusu yazmanız beklenmektedir. Bu sorgu, müşteri bilgilerini ve sipariş detaylarını birleştirerek, her müşterinin toplam harcamasını gösterecektir.
159 |
160 | **Gereksinimler:**
161 |
162 | * Customers: Müşteri bilgilerini içeren tablo.
163 | * Orders: Sipariş bilgilerini içeren tablo.
164 | * Order_Details: Sipariş detaylarını içeren tablo.
165 |
166 | Bu tabloları kullanarak, müşterilerin sipariş bilgilerini birleştirin.
167 |
168 | **Gruplama:**
169 |
170 | * Her müşterinin toplam sipariş tutarını hesaplamak için GROUP BY ifadesini kullanarak gruplama yapın.
171 | * Müşteri kimliği ve adı gibi bilgileri de gösterin.
172 |
173 | **Toplama:**
174 |
175 | * Her müşterinin siparişlerinin toplam tutarını hesaplamak için SUM fonksiyonunu kullanın.
176 |
177 | **Çıktı Formatı:**
178 |
179 | * Sorgunun çıktısı, her müşterinin kimliğini, adını (şirket adı olarak) ve toplam sipariş tutarını içermelidir.
180 |
181 | **Beklentiler:**
182 |
183 | * Yazdığınız SQL sorgusunun doğru çalıştığını ve istenen sonuçları verdiğini göstermek için sorgu çıktısını bir ekran görüntüsü ile belgeleyin.
184 | * Sorgunuzun her bir bölümünü (tablo bağlantıları, gruplama ve toplama) açıklayan kısa bir açıklama ekleyin.
185 |
186 | **Ödevin Teslimi:**
187 |
188 | * Sorgu kodunu ve çıktısını içeren bir dosya (Word veya PDF formatında) oluşturun.
189 | * Dosyanızda, sorgu ile birlikte her bölümün açıklamasını ve ekran görüntüsünü eklemeyi unutmayın.
190 | * ruveydakardelcetin@gmail.com 'a atabilirsiniz.
191 | * **Teslim Tarihi**: **18.11.2024 00.00**
192 |
--------------------------------------------------------------------------------
/modern-web-gelistirme-5.md:
--------------------------------------------------------------------------------
1 | # Modern Web Geliştirme 5
2 |
3 | ## MSSQL Uygulamaları
4 |
5 | -> [https://www.w3schools.com/ ](https://www.w3schools.com/sql/default.asp) ( SQL ile ilgili alıştırmalara bu siteden de bakabilirsiniz.)
6 |
7 | ### SQL Nedir?
8 |
9 | Structured Query Language kelimelerinin kısaltılmışı olan SQL bir veri tabanı uygulamasıdır. Türkçe karşılığı Yapılandırılmış Sorgu Dili anlamına gelmektedir.
10 | Birçok veriyi farklı boyutlarda ve farklı fonksiyonlarda barındıran veri tabanlarını yönetim sistemine verilen isimdir. SQL ile bu verilerin yönetimi, silinmesi, aktif edilmesi ve üzerinde çalışılması mümkündür.Bir programlama dili olmamasına karşın çoğu kişi tarafından bir dil olarak algılanır ve bilinir. Oysa tam anlamıyla veri tabanında kullanılabilecek bir alt dildir.
11 |
12 | 
13 |
14 | ### SQL Sistemleri
15 |
16 | 
17 |
18 | ### MSSQL Nedir?
19 |
20 | Sunduğu birçok özellikler sebebi ile, diğer veri tabanlarından daha iyidir. MYSQL gibi ücretsiz değildir. Sunduğu birçok özellikler sebebi ile diğer veri tabanlarına oranla daha avantajlıdır. MSSQL Access’e oranla veri tabanı konularında daha yeterli ve donanımlıdır. Bu yüzden çoğu kullanıcı tarafından MSSQL tercih edilmektedir.Access de veri tabanı kullanıcılar tarafından oluşturulur ve bu veri tabanları mobil olarak taşınabilir. Ancak MSSQL ‘de durum farklıdır. Veri tabanları server üzerine oluşturulur ve herkes bu server üzerine bağlanabilir. Veri tabanı tek bir noktadan kontrolü sağladığı için hem çok hızlı hem de çok güvenlidir. MSSQL kullanımı için SQL Server 2008, SQL Server 2008 R2, SQL Server 2014 gibi sürümler kullanılabilir.
21 |
22 | ### Microsoft SQL Server’ın İncelenmesi!
23 |
24 | Microsoft SQL Server sürümleri; yazılımı, yazılımı geliştiren programcıyı, yazılımın geliştirildiği şirketi ve yazılımı kullanacak müşterileri ilgilendirmektedir. Bu nedenle doğru bir SQL Sürümünü kullanmak platformu kullanacak olan herkese fayda sağlar. Microsoft, hemen hemen her yıl SQL Server’ı geliştirerek yeni bir sürümünü kullanıcılara sunmaktadır. Ancak SQL Server’ın bütün sürümlerinin özellikleri genel olarak aynı niteliklere sahiptir. Kullanıcılar herhangi bir sürümü seçerek veri tabanı işlemlerini kolaylıkla halledebilir.
25 |
26 | ### Microsoft SQL Server 2019(veya hangi sürümü isterseniz) Kurulum
27 |
28 | - Microsoft SQL Server kurulumunda dikkat edilmesi gereken hususlarda en önemlisi doğru işletim sistemini seçmektir. Günümüze yakın işletim sistemlerini seçmek kullanıcıya hız kazandırabilir, ancak alt sürümlerle de rahatlıkla veri tabanı uygulamaları yapılabilmektedir.
29 | - Microsoft SQL Server kurulumu için .NET Framework 3.4,4.0 ve 4.5 sürümlerinden herhangi biri yüklü olmalıdır.
30 | - Microsoft SQL sürümleri için gerekli setup bileşenleri Microsoft sitesinden kolaylıkla indirilebilir.
31 | - Bilgisayarın özelliğine göre 32 bit mi, 64 bit mi indirilmesi gerektiği hakkında gözlem yapılır.
32 | - Microsoft SQL Server sürümleri Setup’u; gerekli şartlara uygun bir şekilde, Microsoft’un resmî sitesinden indirildikten sonra “Setup” dosyası yönetici olarak çalıştırılır ve daha sonrasında kuruluma geçilir.
33 |
34 | ### Sürümlere nerden ulaşabilirim?
35 |
36 | - https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15 linkinden ulaşabilirsiniz.
37 |
38 | ### Hazır Veri Tabanları İle Çalışma
39 |
40 | NorthWind veya başka hazır veri tabanı kullanarak SQL çalışmalarımızı daha efektif hale getirip ; sorgu pekiştirmesi gerçekleştirme imkanı bulabiliriz. Northwind veri tabanı için aşağıdaki linkten kurulum sağlayabilirsiniz.
41 |
42 | 
43 |
44 | 
45 |
46 |
47 | ### Temel SQL Komutları Giriş
48 |
49 | Structure Query Language namıdeğer SQL bir sorgulama dilidir. Bu sorgulama dilinin sorguladığı zat ise veritabanıdır. Yani o zaman SQL ‘e veritabanını sorgulama dili de diyebiliriz.
50 | SQL de aslında bir programlama dili gibidir. Bir programlama dili kadar kapsamlı olmasa da onun da kendine göre SYNTAX’ları vardır. Bir geliştirici gözü ile de bakıldığında; aslında bir projenin kilit noktalarından birisi de veritabanıdır. Bunu unutmamak gerekir. Veritabanının doğru tasarlanması hatta oluşturulan tablolardaki veri tiplerinin bile seçimi; ileride yapılan geliştirmelerde geliştiricinin karşısına avantaj olarak da çıkabilir; dezavantaj da..
51 |
52 | ## Veri Tipleri
53 |
54 | 
55 |
56 |
57 |
58 | ## Yerleşik Fonksiyonlar
59 |
60 | **SQL Çoklu Satır (Aggregate) Fonksiyonları**
61 |
62 | Bu fonksiyonlar bir sütunda yer alan birden fazla değerler üzerinde yaptığı hesaplamalar sonrası tek bir değer geri verir.
63 |
64 | - **AVG() :** Sayısal değer içeren bir tablo sütunundaki değerlerin ortalamasını verir.
65 | - **COUNT() :** Verilen kriterlere uyan tablo satır sayısını verir.
66 | - **FIRST() :** Tabloda belirtilen sütundaki ilk değeri verir.
67 | - **LAST() :** Tabloda belirtilen sütundaki son değeri verir.
68 | - **MAX() :** Tabloda belirtilen sütundaki en büyük değeri verir.
69 | - **MIN() :** Tabloda belirtilen sütundaki en küçük değeri verir.
70 | - **SUM() :** Sayısal değer içeren bir tablo sütunundaki değerlerin toplamını verir.
71 |
72 |
73 | **SQL Sayısal (Scalar) Fonksiyonları**
74 |
75 |
76 | Bu fonksiyonlar bir sütunda yer alan tek bir değere işlem yapar ve tek bir değer geri verir.
77 |
78 | - **LCASE() :** Bir alan değerini küçük harfe çevirir.
79 | - **LEN() :** Bir metin alanının uzunluğunu verir.
80 | - **MID() :** Bir metin alanındaki karakterlerin bir kısmını elde etmek kullanılır.
81 | - **NOW() :** Bilgisayarın tarih ve saat değerlerini verir.
82 | - **FORMAT() :** Bir veri alanının ne şekilde gösterileceğini belirler.
83 | - **ROUND() :** Sayısal bir veri alanının değerini bir tamsayıya yuvarlar.
84 | - **CEILING() :** Aşağı yuvarla (Herhangi bir ondalık için sayının kendinden büyük, en küçük tam sayıyı verir)
85 | - **FLOOR :** Aşağı yuvarla (Herhangi bir ondalık için sayının kendinden küçük, en büyük tam sayıyı verir)
86 | - **UCASE() :** Bir alan değerini büyük harfe çevirir.
87 |
88 |
89 | ## SQL komutlarına bakıldığında ; iki şekilde değerlendirillir!**
90 | - Data'yı çeken,
91 | - Data'yı değiştiren
92 |
93 | ## DDL & DML Farkı
94 |
95 | DDL ifadeleri genellikle bir veritabanı yöneticisi veya veritabanı yapısını değiştirmek için uygun ayrıcalıklara ve izinlere sahip bir geliştirici tarafından yürütülür. DML, bir veritabanındaki verileri değiştirmek için kullanılır. DML ifadeleri, bir veritabanına veri eklemek, güncellemek ve silmek için kullanılır.
96 |
97 | 
98 |
99 | 
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Mono auto generated files
17 | mono_crash.*
18 |
19 | # Build results
20 | [Dd]ebug/
21 | [Dd]ebugPublic/
22 | [Rr]elease/
23 | [Rr]eleases/
24 | x64/
25 | x86/
26 | [Ww][Ii][Nn]32/
27 | [Aa][Rr][Mm]/
28 | [Aa][Rr][Mm]64/
29 | bld/
30 | [Bb]in/
31 | [Oo]bj/
32 | [Oo]ut/
33 | [Ll]og/
34 | [Ll]ogs/
35 |
36 | # Visual Studio 2015/2017 cache/options directory
37 | .vs/
38 | # Uncomment if you have tasks that create the project's static files in wwwroot
39 | #wwwroot/
40 |
41 | # Visual Studio 2017 auto generated files
42 | Generated\ Files/
43 |
44 | # MSTest test Results
45 | [Tt]est[Rr]esult*/
46 | [Bb]uild[Ll]og.*
47 |
48 | # NUnit
49 | *.VisualState.xml
50 | TestResult.xml
51 | nunit-*.xml
52 |
53 | # Build Results of an ATL Project
54 | [Dd]ebugPS/
55 | [Rr]eleasePS/
56 | dlldata.c
57 |
58 | # Benchmark Results
59 | BenchmarkDotNet.Artifacts/
60 |
61 | # .NET Core
62 | project.lock.json
63 | project.fragment.lock.json
64 | artifacts/
65 |
66 | # ASP.NET Scaffolding
67 | ScaffoldingReadMe.txt
68 |
69 | # StyleCop
70 | StyleCopReport.xml
71 |
72 | # Files built by Visual Studio
73 | *_i.c
74 | *_p.c
75 | *_h.h
76 | *.ilk
77 | *.meta
78 | *.obj
79 | *.iobj
80 | *.pch
81 | *.pdb
82 | *.ipdb
83 | *.pgc
84 | *.pgd
85 | *.rsp
86 | *.sbr
87 | *.tlb
88 | *.tli
89 | *.tlh
90 | *.tmp
91 | *.tmp_proj
92 | *_wpftmp.csproj
93 | *.log
94 | *.vspscc
95 | *.vssscc
96 | .builds
97 | *.pidb
98 | *.svclog
99 | *.scc
100 |
101 | # Chutzpah Test files
102 | _Chutzpah*
103 |
104 | # Visual C++ cache files
105 | ipch/
106 | *.aps
107 | *.ncb
108 | *.opendb
109 | *.opensdf
110 | *.sdf
111 | *.cachefile
112 | *.VC.db
113 | *.VC.VC.opendb
114 |
115 | # Visual Studio profiler
116 | *.psess
117 | *.vsp
118 | *.vspx
119 | *.sap
120 |
121 | # Visual Studio Trace Files
122 | *.e2e
123 |
124 | # TFS 2012 Local Workspace
125 | $tf/
126 |
127 | # Guidance Automation Toolkit
128 | *.gpState
129 |
130 | # ReSharper is a .NET coding add-in
131 | _ReSharper*/
132 | *.[Rr]e[Ss]harper
133 | *.DotSettings.user
134 |
135 | # TeamCity is a build add-in
136 | _TeamCity*
137 |
138 | # DotCover is a Code Coverage Tool
139 | *.dotCover
140 |
141 | # AxoCover is a Code Coverage Tool
142 | .axoCover/*
143 | !.axoCover/settings.json
144 |
145 | # Coverlet is a free, cross platform Code Coverage Tool
146 | coverage*.json
147 | coverage*.xml
148 | coverage*.info
149 |
150 | # Visual Studio code coverage results
151 | *.coverage
152 | *.coveragexml
153 |
154 | # NCrunch
155 | _NCrunch_*
156 | .*crunch*.local.xml
157 | nCrunchTemp_*
158 |
159 | # MightyMoose
160 | *.mm.*
161 | AutoTest.Net/
162 |
163 | # Web workbench (sass)
164 | .sass-cache/
165 |
166 | # Installshield output folder
167 | [Ee]xpress/
168 |
169 | # DocProject is a documentation generator add-in
170 | DocProject/buildhelp/
171 | DocProject/Help/*.HxT
172 | DocProject/Help/*.HxC
173 | DocProject/Help/*.hhc
174 | DocProject/Help/*.hhk
175 | DocProject/Help/*.hhp
176 | DocProject/Help/Html2
177 | DocProject/Help/html
178 |
179 | # Click-Once directory
180 | publish/
181 |
182 | # Publish Web Output
183 | *.[Pp]ublish.xml
184 | *.azurePubxml
185 | # Note: Comment the next line if you want to checkin your web deploy settings,
186 | # but database connection strings (with potential passwords) will be unencrypted
187 | *.pubxml
188 | *.publishproj
189 |
190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
191 | # checkin your Azure Web App publish settings, but sensitive information contained
192 | # in these scripts will be unencrypted
193 | PublishScripts/
194 |
195 | # NuGet Packages
196 | *.nupkg
197 | # NuGet Symbol Packages
198 | *.snupkg
199 | # The packages folder can be ignored because of Package Restore
200 | **/[Pp]ackages/*
201 | # except build/, which is used as an MSBuild target.
202 | !**/[Pp]ackages/build/
203 | # Uncomment if necessary however generally it will be regenerated when needed
204 | #!**/[Pp]ackages/repositories.config
205 | # NuGet v3's project.json files produces more ignorable files
206 | *.nuget.props
207 | *.nuget.targets
208 |
209 | # Microsoft Azure Build Output
210 | csx/
211 | *.build.csdef
212 |
213 | # Microsoft Azure Emulator
214 | ecf/
215 | rcf/
216 |
217 | # Windows Store app package directories and files
218 | AppPackages/
219 | BundleArtifacts/
220 | Package.StoreAssociation.xml
221 | _pkginfo.txt
222 | *.appx
223 | *.appxbundle
224 | *.appxupload
225 |
226 | # Visual Studio cache files
227 | # files ending in .cache can be ignored
228 | *.[Cc]ache
229 | # but keep track of directories ending in .cache
230 | !?*.[Cc]ache/
231 |
232 | # Others
233 | ClientBin/
234 | ~$*
235 | *~
236 | *.dbmdl
237 | *.dbproj.schemaview
238 | *.jfm
239 | *.pfx
240 | *.publishsettings
241 | orleans.codegen.cs
242 |
243 | # Including strong name files can present a security risk
244 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
245 | #*.snk
246 |
247 | # Since there are multiple workflows, uncomment next line to ignore bower_components
248 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
249 | #bower_components/
250 |
251 | # RIA/Silverlight projects
252 | Generated_Code/
253 |
254 | # Backup & report files from converting an old project file
255 | # to a newer Visual Studio version. Backup files are not needed,
256 | # because we have git ;-)
257 | _UpgradeReport_Files/
258 | Backup*/
259 | UpgradeLog*.XML
260 | UpgradeLog*.htm
261 | ServiceFabricBackup/
262 | *.rptproj.bak
263 |
264 | # SQL Server files
265 | *.mdf
266 | *.ldf
267 | *.ndf
268 |
269 | # Business Intelligence projects
270 | *.rdl.data
271 | *.bim.layout
272 | *.bim_*.settings
273 | *.rptproj.rsuser
274 | *- [Bb]ackup.rdl
275 | *- [Bb]ackup ([0-9]).rdl
276 | *- [Bb]ackup ([0-9][0-9]).rdl
277 |
278 | # Microsoft Fakes
279 | FakesAssemblies/
280 |
281 | # GhostDoc plugin setting file
282 | *.GhostDoc.xml
283 |
284 | # Node.js Tools for Visual Studio
285 | .ntvs_analysis.dat
286 | node_modules/
287 |
288 | # Visual Studio 6 build log
289 | *.plg
290 |
291 | # Visual Studio 6 workspace options file
292 | *.opt
293 |
294 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
295 | *.vbw
296 |
297 | # Visual Studio LightSwitch build output
298 | **/*.HTMLClient/GeneratedArtifacts
299 | **/*.DesktopClient/GeneratedArtifacts
300 | **/*.DesktopClient/ModelManifest.xml
301 | **/*.Server/GeneratedArtifacts
302 | **/*.Server/ModelManifest.xml
303 | _Pvt_Extensions
304 |
305 | # Paket dependency manager
306 | .paket/paket.exe
307 | paket-files/
308 |
309 | # FAKE - F# Make
310 | .fake/
311 |
312 | # CodeRush personal settings
313 | .cr/personal
314 |
315 | # Python Tools for Visual Studio (PTVS)
316 | __pycache__/
317 | *.pyc
318 |
319 | # Cake - Uncomment if you are using it
320 | # tools/**
321 | # !tools/packages.config
322 |
323 | # Tabs Studio
324 | *.tss
325 |
326 | # Telerik's JustMock configuration file
327 | *.jmconfig
328 |
329 | # BizTalk build output
330 | *.btp.cs
331 | *.btm.cs
332 | *.odx.cs
333 | *.xsd.cs
334 |
335 | # OpenCover UI analysis results
336 | OpenCover/
337 |
338 | # Azure Stream Analytics local run output
339 | ASALocalRun/
340 |
341 | # MSBuild Binary and Structured Log
342 | *.binlog
343 |
344 | # NVidia Nsight GPU debugger configuration file
345 | *.nvuser
346 |
347 | # MFractors (Xamarin productivity tool) working folder
348 | .mfractor/
349 |
350 | # Local History for Visual Studio
351 | .localhistory/
352 |
353 | # BeatPulse healthcheck temp database
354 | healthchecksdb
355 |
356 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
357 | MigrationBackup/
358 |
359 | # Ionide (cross platform F# VS Code tools) working folder
360 | .ionide/
361 |
362 | # Fody - auto-generated XML schema
363 | FodyWeavers.xsd
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/Migrations/AppDbContextModelSnapshot.cs:
--------------------------------------------------------------------------------
1 | //
2 | using System;
3 | using DotnetWorkshop.Repository;
4 | using Microsoft.EntityFrameworkCore;
5 | using Microsoft.EntityFrameworkCore.Infrastructure;
6 | using Microsoft.EntityFrameworkCore.Metadata;
7 | using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
8 |
9 | #nullable disable
10 |
11 | namespace DotnetWorkshop.Repository.Migrations
12 | {
13 | [DbContext(typeof(AppDbContext))]
14 | partial class AppDbContextModelSnapshot : ModelSnapshot
15 | {
16 | protected override void BuildModel(ModelBuilder modelBuilder)
17 | {
18 | #pragma warning disable 612, 618
19 | modelBuilder
20 | .HasAnnotation("ProductVersion", "6.0.0")
21 | .HasAnnotation("Relational:MaxIdentifierLength", 128);
22 |
23 | SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1);
24 |
25 | modelBuilder.Entity("DotnetWorkshop.Core.Models.Team", b =>
26 | {
27 | b.Property("Id")
28 | .ValueGeneratedOnAdd()
29 | .HasColumnType("int");
30 |
31 | SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
32 |
33 | b.Property("CreatedDate")
34 | .HasColumnType("datetime2");
35 |
36 | b.Property("TeamName")
37 | .IsRequired()
38 | .HasMaxLength(50)
39 | .HasColumnType("nvarchar(50)");
40 |
41 | b.Property("UpdatedDate")
42 | .HasColumnType("datetime2");
43 |
44 | b.HasKey("Id");
45 |
46 | b.ToTable("Teams");
47 |
48 | b.HasData(
49 | new
50 | {
51 | Id = 1,
52 | CreatedDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
53 | TeamName = "Takım 1"
54 | },
55 | new
56 | {
57 | Id = 2,
58 | CreatedDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
59 | TeamName = "Takım 2"
60 | },
61 | new
62 | {
63 | Id = 3,
64 | CreatedDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
65 | TeamName = "Takım 3"
66 | });
67 | });
68 |
69 | modelBuilder.Entity("DotnetWorkshop.Core.Models.User", b =>
70 | {
71 | b.Property("Id")
72 | .ValueGeneratedOnAdd()
73 | .HasColumnType("int");
74 |
75 | SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
76 |
77 | b.Property("CreatedDate")
78 | .HasColumnType("datetime2");
79 |
80 | b.Property("Email")
81 | .IsRequired()
82 | .HasMaxLength(250)
83 | .HasColumnType("nvarchar(250)");
84 |
85 | b.Property("Password")
86 | .IsRequired()
87 | .HasMaxLength(250)
88 | .HasColumnType("nvarchar(250)");
89 |
90 | b.Property("TeamId")
91 | .HasColumnType("int");
92 |
93 | b.Property("UpdatedDate")
94 | .HasColumnType("datetime2");
95 |
96 | b.Property("UserName")
97 | .IsRequired()
98 | .HasMaxLength(50)
99 | .HasColumnType("nvarchar(50)");
100 |
101 | b.HasKey("Id");
102 |
103 | b.HasIndex("TeamId");
104 |
105 | b.ToTable("Users");
106 |
107 | b.HasData(
108 | new
109 | {
110 | Id = 1,
111 | CreatedDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
112 | Email = "test1@gmail.com",
113 | Password = "123123",
114 | TeamId = 1,
115 | UserName = "test1"
116 | },
117 | new
118 | {
119 | Id = 2,
120 | CreatedDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
121 | Email = "test2@gmail.com",
122 | Password = "134134",
123 | TeamId = 2,
124 | UserName = "test2"
125 | },
126 | new
127 | {
128 | Id = 3,
129 | CreatedDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
130 | Email = "test3@gmail.com",
131 | Password = "354565",
132 | TeamId = 3,
133 | UserName = "test3"
134 | });
135 | });
136 |
137 | modelBuilder.Entity("DotnetWorkshop.Core.Models.UserProfile", b =>
138 | {
139 | b.Property("Id")
140 | .ValueGeneratedOnAdd()
141 | .HasColumnType("int");
142 |
143 | SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
144 |
145 | b.Property("FirstName")
146 | .IsRequired()
147 | .HasMaxLength(250)
148 | .HasColumnType("nvarchar(250)");
149 |
150 | b.Property("LastName")
151 | .IsRequired()
152 | .HasMaxLength(250)
153 | .HasColumnType("nvarchar(250)");
154 |
155 | b.Property("UserId")
156 | .HasColumnType("int");
157 |
158 | b.HasKey("Id");
159 |
160 | b.HasIndex("UserId");
161 |
162 | b.ToTable("UserProfiles");
163 |
164 | b.HasData(
165 | new
166 | {
167 | Id = 1,
168 | FirstName = "Test 1",
169 | LastName = "Test test 1",
170 | UserId = 1
171 | },
172 | new
173 | {
174 | Id = 2,
175 | FirstName = "Test 2",
176 | LastName = "Test test 2",
177 | UserId = 2
178 | },
179 | new
180 | {
181 | Id = 3,
182 | FirstName = "Test 3",
183 | LastName = "Test test 3",
184 | UserId = 3
185 | });
186 | });
187 |
188 | modelBuilder.Entity("DotnetWorkshop.Core.Models.User", b =>
189 | {
190 | b.HasOne("DotnetWorkshop.Core.Models.Team", "Team")
191 | .WithMany("Users")
192 | .HasForeignKey("TeamId")
193 | .OnDelete(DeleteBehavior.Cascade)
194 | .IsRequired();
195 |
196 | b.Navigation("Team");
197 | });
198 |
199 | modelBuilder.Entity("DotnetWorkshop.Core.Models.UserProfile", b =>
200 | {
201 | b.HasOne("DotnetWorkshop.Core.Models.User", "User")
202 | .WithMany()
203 | .HasForeignKey("UserId")
204 | .OnDelete(DeleteBehavior.Cascade)
205 | .IsRequired();
206 |
207 | b.Navigation("User");
208 | });
209 |
210 | modelBuilder.Entity("DotnetWorkshop.Core.Models.Team", b =>
211 | {
212 | b.Navigation("Users");
213 | });
214 | #pragma warning restore 612, 618
215 | }
216 | }
217 | }
218 |
--------------------------------------------------------------------------------
/Proje/DotnetWorkshop/DotnetWorkshop.Repository/Migrations/20240209184236_initial.Designer.cs:
--------------------------------------------------------------------------------
1 | //
2 | using System;
3 | using DotnetWorkshop.Repository;
4 | using Microsoft.EntityFrameworkCore;
5 | using Microsoft.EntityFrameworkCore.Infrastructure;
6 | using Microsoft.EntityFrameworkCore.Metadata;
7 | using Microsoft.EntityFrameworkCore.Migrations;
8 | using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
9 |
10 | #nullable disable
11 |
12 | namespace DotnetWorkshop.Repository.Migrations
13 | {
14 | [DbContext(typeof(AppDbContext))]
15 | [Migration("20240209184236_initial")]
16 | partial class initial
17 | {
18 | protected override void BuildTargetModel(ModelBuilder modelBuilder)
19 | {
20 | #pragma warning disable 612, 618
21 | modelBuilder
22 | .HasAnnotation("ProductVersion", "6.0.0")
23 | .HasAnnotation("Relational:MaxIdentifierLength", 128);
24 |
25 | SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1);
26 |
27 | modelBuilder.Entity("DotnetWorkshop.Core.Models.Team", b =>
28 | {
29 | b.Property("Id")
30 | .ValueGeneratedOnAdd()
31 | .HasColumnType("int");
32 |
33 | SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
34 |
35 | b.Property("CreatedDate")
36 | .HasColumnType("datetime2");
37 |
38 | b.Property("TeamName")
39 | .IsRequired()
40 | .HasMaxLength(50)
41 | .HasColumnType("nvarchar(50)");
42 |
43 | b.Property("UpdatedDate")
44 | .HasColumnType("datetime2");
45 |
46 | b.HasKey("Id");
47 |
48 | b.ToTable("Teams");
49 |
50 | b.HasData(
51 | new
52 | {
53 | Id = 1,
54 | CreatedDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
55 | TeamName = "Takım 1"
56 | },
57 | new
58 | {
59 | Id = 2,
60 | CreatedDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
61 | TeamName = "Takım 2"
62 | },
63 | new
64 | {
65 | Id = 3,
66 | CreatedDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
67 | TeamName = "Takım 3"
68 | });
69 | });
70 |
71 | modelBuilder.Entity("DotnetWorkshop.Core.Models.User", b =>
72 | {
73 | b.Property("Id")
74 | .ValueGeneratedOnAdd()
75 | .HasColumnType("int");
76 |
77 | SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
78 |
79 | b.Property("CreatedDate")
80 | .HasColumnType("datetime2");
81 |
82 | b.Property("Email")
83 | .IsRequired()
84 | .HasMaxLength(250)
85 | .HasColumnType("nvarchar(250)");
86 |
87 | b.Property("Password")
88 | .IsRequired()
89 | .HasMaxLength(250)
90 | .HasColumnType("nvarchar(250)");
91 |
92 | b.Property("TeamId")
93 | .HasColumnType("int");
94 |
95 | b.Property("UpdatedDate")
96 | .HasColumnType("datetime2");
97 |
98 | b.Property("UserName")
99 | .IsRequired()
100 | .HasMaxLength(50)
101 | .HasColumnType("nvarchar(50)");
102 |
103 | b.HasKey("Id");
104 |
105 | b.HasIndex("TeamId");
106 |
107 | b.ToTable("Users");
108 |
109 | b.HasData(
110 | new
111 | {
112 | Id = 1,
113 | CreatedDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
114 | Email = "test1@gmail.com",
115 | Password = "123123",
116 | TeamId = 1,
117 | UserName = "test1"
118 | },
119 | new
120 | {
121 | Id = 2,
122 | CreatedDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
123 | Email = "test2@gmail.com",
124 | Password = "134134",
125 | TeamId = 2,
126 | UserName = "test2"
127 | },
128 | new
129 | {
130 | Id = 3,
131 | CreatedDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
132 | Email = "test3@gmail.com",
133 | Password = "354565",
134 | TeamId = 3,
135 | UserName = "test3"
136 | });
137 | });
138 |
139 | modelBuilder.Entity("DotnetWorkshop.Core.Models.UserProfile", b =>
140 | {
141 | b.Property("Id")
142 | .ValueGeneratedOnAdd()
143 | .HasColumnType("int");
144 |
145 | SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
146 |
147 | b.Property("FirstName")
148 | .IsRequired()
149 | .HasMaxLength(250)
150 | .HasColumnType("nvarchar(250)");
151 |
152 | b.Property("LastName")
153 | .IsRequired()
154 | .HasMaxLength(250)
155 | .HasColumnType("nvarchar(250)");
156 |
157 | b.Property("UserId")
158 | .HasColumnType("int");
159 |
160 | b.HasKey("Id");
161 |
162 | b.HasIndex("UserId");
163 |
164 | b.ToTable("UserProfiles");
165 |
166 | b.HasData(
167 | new
168 | {
169 | Id = 1,
170 | FirstName = "Test 1",
171 | LastName = "Test test 1",
172 | UserId = 1
173 | },
174 | new
175 | {
176 | Id = 2,
177 | FirstName = "Test 2",
178 | LastName = "Test test 2",
179 | UserId = 2
180 | },
181 | new
182 | {
183 | Id = 3,
184 | FirstName = "Test 3",
185 | LastName = "Test test 3",
186 | UserId = 3
187 | });
188 | });
189 |
190 | modelBuilder.Entity("DotnetWorkshop.Core.Models.User", b =>
191 | {
192 | b.HasOne("DotnetWorkshop.Core.Models.Team", "Team")
193 | .WithMany("Users")
194 | .HasForeignKey("TeamId")
195 | .OnDelete(DeleteBehavior.Cascade)
196 | .IsRequired();
197 |
198 | b.Navigation("Team");
199 | });
200 |
201 | modelBuilder.Entity("DotnetWorkshop.Core.Models.UserProfile", b =>
202 | {
203 | b.HasOne("DotnetWorkshop.Core.Models.User", "User")
204 | .WithMany()
205 | .HasForeignKey("UserId")
206 | .OnDelete(DeleteBehavior.Cascade)
207 | .IsRequired();
208 |
209 | b.Navigation("User");
210 | });
211 |
212 | modelBuilder.Entity("DotnetWorkshop.Core.Models.Team", b =>
213 | {
214 | b.Navigation("Users");
215 | });
216 | #pragma warning restore 612, 618
217 | }
218 | }
219 | }
220 |
--------------------------------------------------------------------------------
/Uygulamalar/C# Uygulamaları/CSharp-101/CSharp102/Program.cs:
--------------------------------------------------------------------------------
1 | #region Kodların Çalıştırıldığı Kısım
2 | HelloWorld();
3 | MyMethod("kardel", "çetin");
4 | IsMarried("Alex");
5 | IsMarried("Jane");
6 | IsMarriedRefactor("Alex");
7 | IsMarriedInteger("Frank");
8 | CarFeatures();
9 | FindFruitName("elma");
10 | SpecialCarConsole();
11 | animalSoundFeatures();
12 | animalSoundFeatures2();
13 | abstractClassTest();
14 | InterfaceTest();
15 | MultipleInterfaceTest();
16 | TryCatchMethod();
17 | TryCatchMethodFinally();
18 | Throw(20);
19 | #endregion
20 |
21 | #region Metotlar
22 | //Void Metotu: Geri dönüş değeri olmayan fonksiyonlardır.
23 | //Response -> Yazdığımız metotların geri dönüş değerleri olarak adlandırılır.
24 | //(int,list,string,boolean,object vb.)
25 | void HelloWorld()
26 | {
27 | Console.WriteLine("Hello World");
28 | }
29 |
30 | //Metotun gene geri dönüş değeri olmasın.
31 | // İki adet parametre alsın, firstName ve lastName
32 |
33 | void MyMethod(string firstName, string lastName)
34 | {
35 | Console.WriteLine($"Benim adım {firstName}, soyadım ise {lastName}");
36 | }
37 |
38 | //Boolean bir değer döndürsün.
39 | //Alex ise kişi evli , Alex değilse evli değil.
40 |
41 | bool IsMarried(string name)
42 | {
43 | bool isMarried = false;
44 | string message = "";
45 | if (name == "Alex")
46 | {
47 | isMarried = true;
48 | }
49 | else
50 | {
51 | isMarried = false;
52 | }
53 |
54 | if (isMarried)
55 | {
56 | message = $"{name} evlidir. ";
57 | }
58 | else
59 | {
60 | message = $"{name} evli değildir.";
61 | }
62 |
63 | Console.WriteLine(message);
64 |
65 | return isMarried;
66 | }
67 |
68 | //IsMarried Refactor edilmiş hali
69 | bool IsMarriedRefactor(string name)
70 | {
71 | //Ternary If
72 | bool isMarried = name == "Alex" ? true : false;
73 | string message = isMarried ? $"{name} evlidir." : $"{name} evli değildir.";
74 | Console.WriteLine(message);
75 | return isMarried;
76 | }
77 | //interger bir değer döndürecek metot yazalım.
78 | int IsMarriedInteger(string name)
79 | {
80 | //Ternary If
81 | int isMarried = name == "Alex" ? 1 : 0;
82 | string message = isMarried == 1 ? $"{name} evlidir." : $"{name} evli değildir.";
83 | return isMarried;
84 | }
85 |
86 | //Arabanın özelliklerini getiren bir metot yazalım.
87 | Car CarFeatures()
88 | {
89 | //Birinci Yazım şekli
90 | Car car = new Car();
91 | car.year = 2014;
92 | car.color = "black";
93 | car.model = "Renault";
94 |
95 | //İkinci yazım şekli
96 | Car car2 = new Car
97 | {
98 | color = "red",
99 | model = "Nissan",
100 | year = 2012
101 | };
102 |
103 | Console.WriteLine(car.year);
104 | Console.WriteLine(car.model);
105 | ; return car2;
106 | }
107 |
108 | Fruit FindFruitName(string fruitName)
109 | {
110 | Fruit fruit = new Fruit(fruitName);
111 |
112 | Console.WriteLine($"Meyvenin ismi {fruit._fruitName}");
113 |
114 | return fruit;
115 | }
116 |
117 | //Special Car Testi için
118 | void SpecialCarConsole()
119 | {
120 | SpecialCar specialCar = new SpecialCar();
121 | specialCar.CarTest();
122 | }
123 | #endregion
124 | //Polimorfizm 1 örneğinin çalıştırılması.
125 | void animalSoundFeatures()
126 | {
127 | Animal myAnimal = new Animal();
128 | Animal myCat = new Cat();
129 | Animal myDog = new Dog();
130 |
131 | myCat.animalSound();
132 | myDog.animalSound();
133 | }
134 |
135 | //Polimorfizm 2 örneğinin çalıştırılması.
136 | void animalSoundFeatures2()
137 | {
138 | Animal2 myAnimal = new Animal2();
139 | Animal2 myCat = new Cat2();
140 | Animal2 myDog = new Dog2();
141 |
142 | myCat.animalSound();
143 | myDog.animalSound();
144 | }
145 |
146 | //abstract metotunun test edilmesi
147 | void abstractClassTest()
148 | {
149 | Snake snake = new Snake();
150 | //Animal3 animal3 = new Animal3(); // abstract classlar new-le-ne-mez.
151 |
152 | snake.animalSound();
153 | snake.sleep();
154 | }
155 | //Interface örneklerini test etmek için
156 | void InterfaceTest()
157 | {
158 | Bird bird = new Bird();
159 | bird.animalSound();
160 | }
161 |
162 | void MultipleInterfaceTest()
163 | {
164 | Demo demo = new Demo();
165 | demo.myMethod();
166 | demo.mySecondMethod();
167 | }
168 | //enum örneği
169 | void setRole()
170 | {
171 | Level normal = Level.Normal;
172 | Level admin = Level.Admin;
173 | Level intern = Level.Intern;
174 |
175 | Console.WriteLine(normal);
176 | Console.WriteLine(admin);
177 | Console.WriteLine(intern);
178 | }
179 |
180 | #region Try Cath Methodu
181 | void TryCatchMethod()
182 | {
183 | try
184 | {
185 | //hata alabilecek bir kod
186 | int[] myNumbers = { 1, 2, 3 };
187 | Console.WriteLine(myNumbers[10]);
188 | }
189 | catch (Exception e)
190 | {
191 | Console.WriteLine(e.Message);
192 | }
193 | }
194 |
195 | void TryCatchMethodFinally()
196 | {
197 | try
198 | {
199 | // hata alabilecek kod yazılır.
200 | int[] myNumbers = { 1, 2, 3 };
201 | Console.WriteLine(myNumbers[10]);
202 | }
203 | catch (Exception e)
204 | {
205 | // hata alınırsa buraya düşer.
206 | Console.WriteLine("Something went wrong");
207 | }
208 | finally
209 | {
210 | Console.WriteLine("The try catch is finished.");
211 | }
212 | }
213 |
214 | void Throw(int age)
215 | {
216 | if(age > 18 && age < 25)
217 | {
218 | throw new ArithmeticException("Access is denied");
219 | }
220 | else
221 | {
222 | Console.WriteLine("Access granted.");
223 | }
224 | }
225 | #endregion
226 | #region Classlar
227 | class Car
228 | {
229 | public int? year { get; set; }
230 | public string model { get; set; }
231 | public string color { get; set; }
232 | }
233 |
234 | class Fruit
235 | {
236 | public string _fruitName;
237 |
238 | public Fruit(string fruitName)
239 | {
240 | _fruitName = fruitName;
241 | }
242 | }
243 | #endregion
244 |
245 | #region Inheritence(Kalıtım)
246 | class Vehicle // base clas
247 | {
248 | public string _brand = "Nissan";
249 |
250 | public void CarTest()
251 | {
252 | Console.WriteLine($"Bu bir testtir.");
253 | }
254 | }
255 |
256 | class SpecialCar : Vehicle
257 | {
258 | public string modelName = "Renault"; // Special Car Field.
259 | }
260 | #endregion
261 |
262 | #region Polimorfizm 1 ( İstenen Senaryo olmayan kısmı)
263 | class Animal //Base Class
264 | {
265 | public void animalSound()
266 | {
267 | Console.WriteLine("The animal makes a sound");
268 | }
269 | }
270 |
271 | class Cat:Animal
272 | {
273 | public void animalSound()
274 | {
275 | Console.WriteLine("The cat says: miyav");
276 | }
277 | }
278 |
279 | class Dog : Animal
280 | {
281 | public void animalSound()
282 | {
283 | Console.WriteLine("The dog says : hav hav");
284 | }
285 | }
286 | #endregion
287 |
288 | #region Polimorfizm 2 ( Virtual ve Override Kullanımı )
289 | class Animal2 //Base Class
290 | {
291 | public virtual void animalSound()
292 | {
293 | Console.WriteLine("The animal makes a sound");
294 | }
295 | }
296 |
297 | class Cat2 : Animal2
298 | {
299 | public override void animalSound()
300 | {
301 | Console.WriteLine("The cat says: miyav");
302 | }
303 | }
304 |
305 | class Dog2 : Animal2
306 | {
307 | public override void animalSound()
308 | {
309 | Console.WriteLine("The dog says : hav hav");
310 | }
311 | }
312 | #endregion
313 |
314 | #region C# Abstraction
315 | abstract class Animal3 //baseclass
316 | {
317 | public abstract void animalSound();
318 |
319 | public void sleep()
320 | {
321 | Console.WriteLine("Animal is sleeping.");
322 | }
323 | }
324 |
325 | class Snake : Animal3 // Inherit edilmiş class ( miras alınmış class)
326 | {
327 | public override void animalSound()
328 | {
329 | Console.WriteLine("The snake is SsSsSSs");
330 | }
331 | }
332 | #endregion
333 |
334 | #region Interface
335 | //Tek Interface Örneği
336 |
337 | interface IAnimal
338 | {
339 | void animalSound();
340 | }
341 |
342 | class Bird : IAnimal
343 | {
344 | public void animalSound()
345 | {
346 | Console.WriteLine("The bird is cik cik.");
347 | }
348 | }
349 |
350 | //Multiple Interface
351 | interface IFirstInterface
352 | {
353 | void myMethod();
354 | }
355 |
356 | interface ISecondInterface
357 | {
358 | void mySecondMethod();
359 | }
360 |
361 | class Demo : IFirstInterface, ISecondInterface
362 | {
363 | public void myMethod()
364 | {
365 | Console.WriteLine("Bu birinci metottur.");
366 | }
367 |
368 | public void mySecondMethod()
369 | {
370 | Console.WriteLine("Bu ikinci metottur.");
371 | }
372 | }
373 |
374 | #endregion
375 |
376 | #region Enums
377 | enum Level
378 | {
379 | Admin,
380 | Normal,
381 | Intern
382 | }
383 | #endregion
--------------------------------------------------------------------------------
/modern-web-gelistirme-10.md:
--------------------------------------------------------------------------------
1 | # Dotnet Core Temelleri
2 | ## Entity Framework Nedir ?
3 |
4 | Hafif, genişletilebilir ve open source olan veri erişim teknolojisidir. Microsoft tarafından geliştirilmektedir.
5 | EF Core kullanırken sıklıkla karşımıza çıkacak iki ifade vardır.
6 | Entity Framework Core (EF Core), Microsoft tarafından geliştirilen, .NET platformu için bir nesne ilişkisel eşleme (Object-Relational Mapping, ORM) framework'üdür. ORM, veritabanıyla nesne tabanlı programlama arasındaki uyumu sağlamak amacıyla kullanılır. Entity Framework Core, özellikle .NET Core ve .NET 5 gibi çeşitli .NET platformlarında çalışabilen hafif ve açık kaynaklı bir ORM çözümüdür.
7 |
8 | Entity Framework Core, .NET uygulamalarının veritabanlarıyla etkileşimde bulunmasını kolaylaştırmak için kullanılır. Bu framework sayesinde, veritabanındaki tabloları, sütunları ve ilişkileri nesne modelleriyle eşleştirebilirsiniz. Bu sayede, veritabanı işlemlerini SQL sorguları yazmak yerine nesne yönelimli bir yaklaşımla gerçekleştirebilirsiniz.
9 |
10 |
11 | - ORM (Object-Relational Mapping)
12 | - LINQ (Language Integrated Query)
13 |
14 | **ORM:** Veri tabanına erişim tekniğidir. OOP'nin tüm nimetlerinden faydalanarak veri tabanlarına karşı queryler oluşturmamızı sağlar. ( Create,update,delete vb.)
15 | Bu ORM tekniği altında birçok veri erişim teknolojisi vardır. Mini ORM olarak ifade edilen Dapper veri erişim teknolojisidir.
16 |
17 | **Linq:** C# 3.0 ile hayatımıza giren sorgular oluşturmamıza imkan veren bir teknolojidir. EF core vE linq birbirini tamamlayan teknolojilerdir. Örneğin C# dilindeki collectionlara karşı Queryler oluşturabiliyorsunuz(List,Linked List,Dictionary). Bunlara karşı sorgular oluşturabiliyrsunuz ve bunları tip güvenli olarak gerçekleştirebilirsiniz. Linq ve EF Core farklı teknolojilerdir. EF core veri erişim teknolojisidir. Sorguların SQL cümleciğine çevrilmesi, veri tabanına gönderilmesi, veri tabanından gönderilen datanın Linq tarafında belirtilen tiplere maplenmesi gibi tüm süreçler EF Core tarafından yönetilmektedir. Linq sadece tip güvenli sorgular oluşturmamıza imkan vermektedir.
18 |
19 | _EF Core'un temel özellikleri arasında şunlar bulunur:_
20 |
21 | - **Code First Yaklaşımı:** Veritabanı şemalarını kodunuzdaki sınıflara dayalı olarak oluşturmanızı sağlar. Kod tarafında sınıfları tanımlayarak, EF Core otomatik olarak veritabanını oluşturabilir.
22 | - **Migration Desteği:** Veritabanındaki şemada yapılan değişiklikleri takip edebilmeniz ve bu değişiklikleri uygulayabilmeniz için migration (geçiş) mekanizması sunar.
23 | - **LINQ Desteği:** LINQ (Language Integrated Query) kullanarak veritabanına sorgular yazabilirsiniz. Bu, SQL sorguları yazmak yerine daha okunabilir ve yönetilebilir sorgular oluşturmanıza olanak tanır.
24 | - **Çeşitli Veritabanı Motorları Desteği:** EF Core, çeşitli veritabanı motorlarına uyumlu olarak çalışabilir. Microsoft SQL Server, PostgreSQL, MySQL, SQLite gibi popüler veritabanlarına destek sağlar.
25 | - **Performans İyileştirmeleri:** EF Core, performansı artırmak ve gereksiz sorguları önlemek için çeşitli optimizasyonlar içerir.
26 |
27 | Entity Framework Core, geliştiricilere veritabanı işlemlerini basitleştirmek ve daha az kod yazarak veritabanıyla etkileşimde bulunmalarını sağlamak için güçlü bir araç sunar.
28 |
29 | ## Entity Framework Core Avantajları nelerdir?
30 |
31 | Entity Framework, .NET tabanlı uygulamalarda veritabanı işlemlerini kolaylaştırmak ve veritabanı ile nesne modelleri arasında bir köprü görevi görmek üzere tasarlanmış bir ORM (Object-Relational Mapping) framework'üdür. İşte Entity Framework'ün avantajları:
32 |
33 | **Nesne Yönelimli Tasarım (OOD):**
34 | Entity Framework, veritabanı tablolarını nesne modelleriyle eşleştirerek, nesne yönelimli tasarımın güzelliklerini sunar. Bu, geliştiricilere veritabanı işlemlerini nesne tabanlı bir şekilde gerçekleştirebilmelerini sağlar.
35 |
36 | **Code First ve Database First Yaklaşımları:**
37 | Entity Framework, iki farklı yaklaşım sunar. Code First yaklaşımıyla sınıfları oluşturarak veritabanını oluşturabilirsiniz. Database First yaklaşımıyla ise var olan bir veritabanını modele dönüştürebilirsiniz.
38 |
39 | **LINQ Entegrasyonu:**
40 | LINQ (Language Integrated Query) kullanarak Entity Framework üzerinden veritabanı sorgularını yazabilirsiniz. Bu, SQL sorgularını yazmak zorunda kalmadan, daha okunabilir ve yönetilebilir sorgular oluşturmanıza olanak tanır.
41 |
42 | **Migration Desteği:**
43 | Veritabanındaki değişiklikleri takip etmek ve uygulamak için migration'ları kullanabilirsiniz. Bu, modelinizi güncellediğinizde veritabanınızı otomatik olarak güncellemenizi sağlar.
44 |
45 | **Çeşitli Veritabanı Motorları Desteği:**
46 | Entity Framework, farklı veritabanı motorlarına uyumlu olarak çalışabilir. Microsoft SQL Server, PostgreSQL, MySQL, SQLite gibi popüler veritabanlarına destek sağlar.
47 |
48 | **Performans İyileştirmeleri:**
49 | Entity Framework, performansı artırmak ve gereksiz sorguları önlemek için çeşitli optimizasyonlar içerir. Örneğin, sorguların önbelleğe alınması gibi.
50 |
51 | **Model İlişkileri ve Bağlantıları Kolay Yönetim:**
52 | İlişkileri ve bağlantıları modelleme ve yönetme konusunda Entity Framework oldukça esnek ve güçlüdür. Foreign key, primary key gibi ilişkileri kolayca tanımlayabilirsiniz.
53 |
54 | **Unit Test Desteği:**
55 | Entity Framework, unit test yazarken veritabanı bağımlılıklarını yönetmeyi kolaylaştırır. In-memory veritabanı gibi özelliklerle testleri daha etkili bir şekilde gerçekleştirebilirsiniz.
56 |
57 | **Entegrasyon Kolaylığı:**
58 | .NET platformuyla entegre olduğu için, Entity Framework kullanmak, diğer .NET teknolojileriyle uyumluluğu artırır.
59 |
60 | **Güçlü Veri Modelleme:**
61 | Entity Framework, güçlü bir veri modelleme yeteneği sunar. Veritabanındaki karmaşık yapıları, sınıflar ve ilişkiler üzerinden nesne modellerine dönüştürme konusunda etkilidir.
62 |
63 | Entity Framework, bu avantajlarıyla birlikte .NET geliştiricilerine veritabanı işlemlerini daha kolay, hızlı ve etkili bir şekilde gerçekleştirme imkanı sunar. Ancak, her avantajın yanında bazı durumlar için dikkate alınması gereken dezavantajlar da olabilir, bu nedenle kullanmadan önce projenizin ihtiyaçlarına uygun olduğundan emin olmalısınız.
64 |
65 | ## Entity Framework Dezavantajları nelerdir?
66 |
67 | **Performans Sorunları:**
68 |
69 | Entity Framework, özellikle büyük ve karmaşık veritabanları ile çalışırken performans sorunlarına neden olabilir. Özel optimizasyonlar ve dikkatli sorgu yazımı olmadan, sorguların veritabanında yetersiz performansa neden olma olasılığı vardır.
70 |
71 | **Veritabanı Tasarımı ve Optimizasyon Zorlukları:**
72 |
73 | Entity Framework kullanırken, veritabanı tasarımında ve optimizasyonunda bazı kısıtlamalarla karşılaşabilirsiniz. Özellikle, gelişmiş veritabanı optimizasyonlarını gerçekleştirmek istediğinizde, doğrudan SQL sorguları yazmak daha etkili olabilir.
74 |
75 | **Karmaşıklık ve Öğrenme Eğrisi:**
76 |
77 | Entity Framework, büyük projelerde kullanıldığında karmaşık hale gelebilir ve öğrenme eğrisi yüksek olabilir. Uygulama gereksinimlerinize uygun şekilde yapılandırma ve kullanma konusunda dikkatli olmak önemlidir.
78 |
79 | **Yetersiz Özel Mappings:**
80 |
81 | Entity Framework, bazı durumlarda özel veritabanı sütunlarını sınıflara bağlamakta veya özel bir şekilde sorgu oluşturmada yetersiz kalabilir. Bu durumda, stored procedure veya doğrudan SQL kullanma ihtiyacı doğabilir.
82 |
83 | **Çalışma Zamanı Performansı:**
84 |
85 | Entity Framework, veritabanı sorgularını çalışma zamanında oluşturduğu için, bu durum performans maliyetine neden olabilir. Özellikle, aynı sorguların tekrar tekrar kullanıldığı durumlarda bu maliyet artabilir.
86 |
87 | **Gelişmiş Veri Kontrolü Eksikliği:**
88 |
89 | Bazı durumlarda, Entity Framework'un otomatik olarak oluşturduğu SQL sorguları, gelişmiş veri kontrolü veya özel işlemler gerçekleştirme ihtiyacını karşılamayabilir. Bu durumda, doğrudan SQL veya stored procedure kullanma ihtiyacı doğabilir.
90 |
91 | **Veritabanı Bağımlılığı:**
92 |
93 | Entity Framework, genellikle bir veritabanı motoruna bağımlı olarak çalışır. Bu durum, veritabanı motorunu değiştirmek istediğinizde uyumluluk sorunlarına neden olabilir.
94 |
95 | **Zayıf Offline Desteği:**
96 |
97 | Entity Framework, offline çalışma senaryolarını desteklemede bazı zorluklar yaşayabilir. Mobil uygulamalar veya sınırlı ağ bağlantıları olan senaryolarda offline desteği eksik olabilir.
98 | Bu dezavantajlar, Entity Framework'ün kullanımı sırasında karşılaşılabilecek potansiyel sorunlardır. Her projenin ihtiyaçları farklı olduğu için, Entity Framework kullanımı öncesinde avantajları ve dezavantajları dikkatlice değerlendirmek önemlidir.
99 |
100 | ## EF Core hangi veri tabanlarında çalışır?
101 |
102 |
103 | Entity Framework Core, birden çok veritabanı yönetim sistemini destekler. Ancak, desteklenen veritabanları zamanla değişebilir ve geliştikçe yeni sürümlerle yeni veritabanları eklenir. Entity Framework Core 5.0 sürümüne kadar, aşağıdaki veritabanı sistemleri desteklenmiştir:
104 |
105 | **Microsoft SQL Server:** Entity Framework Core, Microsoft SQL Server ile entegrasyon sağlar. Microsoft.EntityFrameworkCore.SqlServer paketini kullanarak SQL Server ile etkileşime geçebilirsiniz.
106 |
107 | **MySQL:** MySQL veritabanı için Entity Framework Core sürücüsü mevcuttur. MySql.Data.EntityFrameworkCore paketi, MySQL veritabanı ile çalışmak için kullanılabilir.
108 |
109 | **PostgreSQL:** Entity Framework Core, PostgreSQL ile uyumludur. Npgsql.EntityFrameworkCore.PostgreSQL paketi, PostgreSQL veritabanı ile etkileşim için kullanılır.
110 |
111 | **SQLite:** Entity Framework Core, hafif ve yerel bir veritabanı olan SQLite ile kullanılabilir. Microsoft.EntityFrameworkCore.Sqlite paketi, SQLite veritabanı ile çalışmak için kullanılır.
112 |
113 | **In-Memory Database:** Entity Framework Core ayrıca, hafızada çalışan geçici bir veritabanı olarak kullanılabilecek bir in-memory veritabanını destekler. Bu, testler ve hızlı prototipler oluşturmak için kullanışlıdır.
114 |
115 | Bu, Entity Framework Core'un desteklediği bazı veritabanlarıdır, ancak gelişen zaman içinde yeni sürümlerle yeni veritabanları eklenmiş olabilir. Projelerinizin ihtiyaçlarına ve kullanılan teknolojilere bağlı olarak, uygun veritabanı sürücüsünü seçmek önemlidir.
116 |
--------------------------------------------------------------------------------
/Uygulamalar/C# Uygulamaları/CSharp-101/CSharp-Get-Started/Program.cs:
--------------------------------------------------------------------------------
1 | #region 1-) Komut Satırına Yazdırma İşlemleri
2 | Console.WriteLine("Hello World!");
3 | Console.WriteLine(2 + 2);
4 | #endregion
5 |
6 | #region 2-) Yorum Satırı İşlemleri
7 | //Yorum Satırı İşlemleri
8 |
9 | /*
10 | Console.WriteLine("Test");
11 | Console.WriteLine("Test2");
12 | */
13 | #endregion
14 |
15 | #region 3-) C# Değişkenler
16 | // Integer bir veri tipi tanımlayalım.
17 | int number = 0;
18 | int age = 21;
19 |
20 | Console.WriteLine(number + age);
21 |
22 | //Double bir değer tanımlama
23 | double doubleCase = 5.99D;
24 | Console.WriteLine(doubleCase);
25 |
26 | //Char veri tipi
27 | char charValue = 'h';
28 | Console.WriteLine(charValue);
29 |
30 | //String değerler
31 | var name = "Kardel";
32 | string surname = "Çetin";
33 |
34 | Console.WriteLine(String.Format("Adı : {0} Soyadı: {1}", name, surname));
35 | Console.WriteLine($"Adı: {name} Soyadı:{surname}");
36 |
37 | //Boolean Değerler
38 | bool isActive = false;
39 |
40 | //Ternary If Örneği
41 | isActive = name == "Kardel" ? true : false;
42 | string message = isActive ? $"{name} kullanıcısı aktif bir kullanıcıdır. " : $"{name} kullanıcısı pasif bir kullanıcıdır. ";
43 |
44 | //Normal If Kullanımı
45 | if (name == "Kardel")
46 | {
47 | isActive = true;
48 | }
49 | else
50 | {
51 | isActive = false;
52 | }
53 |
54 | string message2 = "";
55 |
56 | if (isActive)
57 | {
58 | message2 = $"{name} kullanıcısı aktif bir kullanıcıdır. ";
59 | }
60 | else
61 | {
62 | message2 = $"{name} kullanıcısı pasif bir kullanıcıdır. ";
63 | }
64 |
65 | Console.WriteLine(message2);
66 | #endregion
67 |
68 | #region 4-) Casting İşlemleri
69 | //Double bir değeri integera cast etmek
70 | double myValue = 9.83;
71 | int myIntegerValue = (int)myValue;
72 |
73 | Console.WriteLine(myIntegerValue);
74 |
75 | //Convert
76 | int integerValueCast = 19;
77 | double doubleValueCast = 2.28;
78 | bool myBooleanCast = false;
79 |
80 | //Stringe Convert Etme
81 | string intToString = Convert.ToString(integerValueCast);
82 | Console.WriteLine(intToString);
83 |
84 | //Convert To Double -> Integer bir değeri Double'a çevirme işlemi
85 | double intToDouble = Convert.ToDouble(integerValueCast);
86 | Console.WriteLine(intToDouble);
87 | //Convert To Int32 -> Double bir değeri int değere çevirme
88 | int doubleToInt = Convert.ToInt32(doubleValueCast);
89 |
90 | //Tablonuzda ID değeri vardır,Ama bu Id Değeri string bir biçimde tutulmuştur.
91 | //"1203" ( Yüsra )
92 | var id = "1203";
93 | int idIntValue = Convert.ToInt32(id);
94 |
95 | //Convert Kullanılmadan Stringi integera çevirme işlemi ( Gizem Turan )
96 | #region String'i Int Çevirme İşlemi
97 | int result = 0;
98 | int sign = 1;
99 |
100 | string nameString = "234";
101 |
102 | //Convert To Int 32 kullanarak String bir değeri Int'e çevirebilirim.
103 | int resultNormal = Convert.ToInt32(nameString);
104 |
105 | //String içindeki her karakteri kontrol edebilmek için bir döngüye ihtiyacım var.
106 | //Döngülerde de kullanabilecekleriniz : for,while,foreach
107 | //Eğer bu hayatı sevmiyorsam aşağıdakini kullanabilirim.
108 |
109 | foreach (char c in nameString)
110 | {
111 | //Eğer karakterim bir sayıdan oluşursa
112 | if (char.IsDigit(c))
113 | {
114 | //Sayıyı bulduktan sonra sonuca ekleme işlemini gerçekleştirelim.
115 | result = result * 10 + (c - '0');
116 | }
117 | else if (c == '-' && result == 0)
118 | {
119 | //Eğer karakterlerden bir tanesi "-" ve henüz bir sayı
120 | sign = -1;
121 | }
122 |
123 | //İşaret İşlemlerini Uygulasın
124 |
125 | result *= sign;
126 | //Console.WriteLine(result);
127 | }
128 | #endregion
129 | #endregion
130 |
131 | #region 5-) Konsolda User Input İşlemleri
132 | //Konsola aşağıdaki alanı yazdırınız.
133 | //Console.WriteLine("Kullanıcı adınızı giriniz.");
134 |
135 | //Konsola ne yazarsam o değeri alsın ;
136 | string userName = Console.ReadLine();
137 | //Tekrardan konsola yazdırsın.
138 | //Console.WriteLine($"Konsoldan gelen değer : {userName}");
139 | #endregion
140 |
141 | #region 6-) Operatörler
142 |
143 | //Aritmetik Operatörler
144 | int resultOperator = 2;
145 |
146 | resultOperator *= 4;
147 | resultOperator += 6;
148 | resultOperator -= 1;
149 | resultOperator /= 2;
150 |
151 | //Karşılaştırma Operatörleri
152 | //>,>=,<,<=, ==, !=
153 |
154 | Console.WriteLine("Operatörler için sayı değeri giriniz.");
155 | string integerValueString = Console.ReadLine();
156 | int integerValue = Convert.ToInt32(integerValueString);
157 |
158 | List messageList = new List();
159 |
160 | if (integerValue > 7)
161 | {
162 | messageList.Add("Verilen değer 7'den büyüktür.");
163 | }
164 |
165 | if (integerValue >= 7)
166 | {
167 | messageList.Add("Verilen değer 7'den büyük veye 7'ye eşittir. ");
168 | }
169 |
170 | if (integerValue < 8)
171 | {
172 | messageList.Add("Verilen değer 8'den küçüktür.");
173 | }
174 |
175 | if (integerValue <= 8)
176 | {
177 | messageList.Add("Verilen değer 8'den küçük veya eşittir.");
178 | }
179 |
180 | if (integerValue == 12)
181 | {
182 | messageList.Add("Verilen değer 12'ye eşittir.");
183 | }
184 |
185 | if (integerValue != 12)
186 | {
187 | messageList.Add("Verilen değer 12'ye eşit değildir. ");
188 | }
189 |
190 | // Mantıksal Operatörler ( &&, || )
191 |
192 | //Konsola girilen sayı 8 ile 12 arasında olsun
193 |
194 | if (integerValue > 8 && integerValue < 12)
195 | {
196 | messageList.Add("Bu sayı 8 ile 12 arasındadır.");
197 | }
198 |
199 | if (integerValue == 8 || integerValue > 8)
200 | {
201 | messageList.Add("Bu sayı 8'e eşit ya da 8'den büyüktür.");
202 | }
203 |
204 | Console.WriteLine(String.Join("\n", messageList));
205 |
206 |
207 | #endregion
208 |
209 | #region 7-) Strings
210 | var firstName = "Kardel";
211 | var secondName = "Rüveyda";
212 |
213 | //String birleştirme Türleri
214 |
215 | var nameJoin = firstName + ' ' + secondName;
216 | var nameConcat = string.Concat(firstName, ' ', secondName);
217 | var stringInterpolation = $"Benim adım {firstName} ikinci adım ise {secondName}";
218 | var stringFormat = String.Format("Benim adım {0} ikinci adım ise {1}", firstName, secondName);
219 |
220 | Console.WriteLine(nameJoin);
221 | Console.WriteLine(nameConcat);
222 | Console.WriteLine(stringInterpolation);
223 | Console.WriteLine(stringFormat);
224 | #endregion
225 |
226 | #region 8-) IF - ELSE Şekilleri
227 |
228 | int value = 3;
229 |
230 | //Basit bir if örneği
231 | if (value != 3)
232 | {
233 | Console.WriteLine("Bu ifade 3 değildir.");
234 | }
235 |
236 | //Else-if
237 |
238 | if (value != 3)
239 | {
240 | Console.WriteLine("Bu ifade 3 değildir.");
241 | }
242 | else if (value != 2)
243 | {
244 | Console.WriteLine("Bu ifade 2 değildir.");
245 | }
246 | else
247 | {
248 | Console.WriteLine("Bu ifade 2 ya da 3 değildir.");
249 | }
250 |
251 | // Normal bir if else örneği
252 | string messageStringIf = "";
253 |
254 | if (value == 2)
255 | {
256 | messageStringIf = "Bu ifade 2'dir";
257 | }
258 | else
259 | {
260 | messageStringIf = "Bu ifade 2 değildir.";
261 | }
262 |
263 | //Ternary If
264 | messageStringIf = value == 2 ? "Bu ifade 2'dir" : "Bu ifade 2 değildir.";
265 | //Daha karmaşık bir ternary If yazalım .
266 | messageStringIf = value == 2 ? "Buradaki değer 2'dir." : (value < 2 ? "Buradaki değer 2'den küçüktür." : "Buradaki değer 2'den büyüktür.");
267 |
268 | //Ternary If'in normal If'e dönüştürülmüş hali
269 | if (value == 2)
270 | {
271 | messageStringIf = "Buradaki değer 2'dir.";
272 | }
273 | else
274 | {
275 | if (value < 2)
276 | {
277 | messageStringIf = "Buradaki değer 2'den küçüktür.";
278 | }
279 | else
280 | {
281 | messageStringIf = "Buradaki değer 2'den büyüktür.";
282 | }
283 | }
284 |
285 | #endregion
286 |
287 | #region 9-) Switch Case
288 |
289 | int switchNumber = 10;
290 |
291 | switch (switchNumber)
292 | {
293 | case 10:
294 | Console.Write("Bu sayı 10'dur");
295 | break;
296 | case 11:
297 | Console.WriteLine("Bu sayı 11'dir.");
298 | break;
299 | default:
300 | Console.WriteLine("Bu sayı girdiğiniz herhangi bir değerle eşleşmiyor.");
301 | break;
302 | }
303 |
304 | //Switch'i ife çevirirsek.
305 | if (switchNumber == 10)
306 | {
307 | Console.Write("Bu sayı 10'dur");
308 | }
309 | else if (switchNumber == 11)
310 | {
311 | Console.WriteLine("Bu sayı 11'dir.");
312 | }
313 | else
314 | {
315 | Console.WriteLine("Bu sayı girdiğiniz herhangi bir değerle eşleşmiyor.");
316 | }
317 |
318 | #endregion
319 |
320 | #region 10-) For ve While ile 1000 kere özür dilerim yazdıralım
321 |
322 | //For döngüsü
323 | for (int i = 0; i < 1000; i++)
324 | {
325 | Console.WriteLine("Özür dilerim.");
326 | }
327 |
328 | //While Döngüsü
329 |
330 | int counter = 0;
331 |
332 | while (counter<1000)
333 | {
334 | Console.WriteLine("Özür dilerim.");
335 | counter++;
336 | }
337 |
338 | #endregion
339 |
340 | #region 11-) Foreach Kullanımı
341 | List listIntegers = new List();
342 |
343 | listIntegers.Add(1);
344 | listIntegers.Add(2);
345 | listIntegers.Add(3);
346 |
347 | foreach (var item in listIntegers)
348 | {
349 | Console.WriteLine(item);
350 | }
351 | #endregion
352 |
353 | #region 12-) Arrays
354 |
355 | // Dört elmanlı bir dizi oluşturun ve değerleri sonra ekleyin .
356 | string[] cars = new string[4];
357 |
358 | //Dört elemanlı bir dizi oluşturun ve elemanları ekleyin.
359 | cars = new string[4] { "Volvo", "BMW", "Porche", "Nissan" };
360 |
361 | //Boyut belirtmeden dört elemanlı bir dizi oluşturabilrisiniz
362 | string[] carsNew = new string[] { "Volvo", "Bmw", "Porche", "Nissan", "Renault" };
363 |
364 | //new anahtarı sözcüğünü kullanmadan dizi oluşturabilirsiniz.
365 | string[] carsNew2 = { "Test", "Test1", "Test2" };
366 |
367 |
368 | // 3 adet string tipinde bir dizi oluşturun ve değerlerini sonradan ekleyin.
369 | string[] myCars = new string[3];
370 | int[] myNumbers = new int[3];
371 |
372 | // Değerleri sonradan atayalım.
373 | cars[0] = "Toyota";
374 | cars[1] = "Ford";
375 | cars[2] = "Nissan";
376 |
377 | myNumbers[0] = 10;
378 | myNumbers[1] = 20;
379 | myNumbers[3] = 30;
380 |
381 | #endregion
382 |
383 |
384 |
--------------------------------------------------------------------------------
/modern-web-gelistirme-11.md:
--------------------------------------------------------------------------------
1 | # Dotnet Core Best Practices
2 |
3 | ## HTTP Method Seçimi
4 |
5 | HTTP (Hypertext Transfer Protocol) protokolü, web üzerinde bilgi alışverişi yapmak için kullanılan bir protokoldür. HTTP, belirli amaçlara hizmet eden bir dizi metod (method) veya eylem içerir. Bu metodlar, HTTP isteğinin amacını belirtir ve isteğin ne tür bir işlem gerçekleştirmesi gerektiğini tanımlar. İşte bazı temel HTTP metodları:
6 |
7 | **GET:**
8 |
9 | - Kaynaklardan bilgi almak için kullanılır.
10 | - İstek gövdesi yoktur ve veri göndermez.
11 | - Cevap olarak bir kaynak veya durum kodu dönebilir.
12 |
13 | **POST:**
14 |
15 | - Yeni bir kaynak oluşturmak veya varolan bir kaynağı güncellemek için kullanılır.
16 | - İstek gövdesinde veri taşır.
17 | - Genellikle form verileri veya JSON gibi veri formatlarıyla kullanılır.
18 |
19 | **PUT:**
20 |
21 | - Belirtilen URI'deki kaynağı oluşturmak veya güncellemek için kullanılır.
22 | - İstek gövdesinde taşınan veri, kaynağın tamamını temsil eder.
23 |
24 | **DELETE:**
25 |
26 | - Belirtilen URI'deki kaynağı silmek için kullanılır.
27 | - İstek gövdesi olmaz veya boştur.
28 |
29 | ## Http Durum Kodları
30 |
31 | **1xx - Bilgi:**
32 |
33 | - 100 Continue: İstemcinin, devam etmesi durumunda bir isteğin tamamlanabileceğini bildiren bir yanıt.
34 |
35 | **2xx - Başarılı:**
36 |
37 | - 200 OK: İstek başarıyla gerçekleştirildi.
38 | - 201 Created: İstekle yeni bir kaynak oluşturuldu.
39 | - 204 No Content: İstek başarılı olsa da yanıt içerik taşımaz.
40 |
41 | **3xx - Yönlendirme:**
42 |
43 | - 301 Moved Permanently: Kaynak, kalıcı olarak başka bir URI'ye taşındı.
44 | - 302 Found: Kaynak, geçici olarak başka bir URI'ye taşındı.
45 | - 304 Not Modified: Kaynak, istemcinin önbelleklenmiş bir sürümüne dayalı olarak güncellenmedi.
46 |
47 | **4xx - İstemci Hatası:**
48 |
49 | - 400 Bad Request: İstek yapısal olarak yanlış veya anlaşılamaz.
50 | - 401 Unauthorized: Kimlik doğrulama gerekiyor veya başarısız oldu.
51 | - 403 Forbidden: İstemci, kaynağa erişim iznine sahip değil.
52 | - 404 Not Found: Belirtilen URI'deki kaynak bulunamadı.
53 | - 405 Method Not Allowed: Belirtilen metod, bu kaynağa uygulanamaz.
54 | - 429 Too Many Requests: İstemci, belirli bir süre içinde çok fazla istek gönderdi.
55 |
56 | **5xx - Sunucu Hatası:**
57 |
58 | - 500 Internal Server Error: Sunucu genel bir hata ile karşılaştı.
59 | - 501 Not Implemented: Sunucu, isteği yerine getirmek için gerekli yeteneklere sahip değil.
60 | - 503 Service Unavailable: Sunucu şu anda hizmet veremiyor. Geçici olarak bakım modunda olabilir veya aşırı yük altında olabilir.
61 |
62 | Bu durum kodları, bir HTTP yanıtının genel durumunu belirtir. Ancak, bu kodların her biri daha spesifik durumları ifade edebilir ve belirli durumlar için uygun olan kodlar değişebilir. Bu durum kodlarını doğru bir şekilde anlamak, web uygulamalarının hata ayıklamasını ve hata yönetimini geliştirmek açısından önemlidir.
63 |
64 | ## Doğru Endpoint Kullanımı
65 |
66 | **GET - Tüm Makaleleri Getir:**
67 |
68 | - **Açıklama:** Tüm makaleleri getiren bir endpoint.
69 | - **Endpoint:** GET /api/articles
70 |
71 | **GET - Belirli Bir Makaleyi Getir:**
72 |
73 | - Açıklama: Belirli bir makaleyi ID ile getiren bir endpoint.
74 | - Endpoint: GET /api/articles/{id}
75 |
76 | **POST - Yeni Makale Oluştur:**
77 |
78 | - **Açıklama:** Yeni bir makale oluşturan bir endpoint.
79 | - **Endpoint:** POST /api/articles
80 |
81 | **PUT - Makaleyi Güncelle:**
82 |
83 | - **Açıklama:** Belirli bir makaleyi güncelleyen bir endpoint.
84 | - **Endpoint:** PUT /api/articles/{id}
85 |
86 | **DELETE - Makaleyi Sil:**
87 |
88 | - Açıklama: Belirli bir makaleyi silen bir endpoint.
89 | - Endpoint: DELETE /api/articles/{id}
90 |
91 | **GET - Makaleye Yorumları Getir:**
92 |
93 | - **Açıklama:** Belirli bir makaleye ait yorumları getiren bir endpoint.
94 | - **Endpoint:** GET /api/articles/{id}/comments
95 |
96 | **POST - Yeni Yorum Ekle:**
97 |
98 | - **Açıklama:** Belirli bir makaleye yeni bir yorum ekleyen bir endpoint.
99 | - **Endpoint:** POST /api/articles/{id}/comments
100 |
101 | **GET - Kategorilere Göre Makaleleri Getir:**
102 |
103 | - **Açıklama:** Belirli bir kategoriye ait makaleleri getiren bir endpoint.
104 | - **Endpoint:** GET /api/categories/{category}/articles
105 |
106 | **GET - Kullanıcının Tüm Makalelerini Getir:**
107 |
108 | - **Açıklama:** Belirli bir kullanıcının tüm makalelerini getiren bir endpoint.
109 | - **Endpoint:** GET /api/users/{userId}/articles
110 |
111 | Bu örneklerde dikkat edilmesi gereken noktalar şunlar:
112 |
113 | - Endpoint isimleri açık ve anlaşılır.
114 | - HTTP metodları, istenen operasyona uygun olarak kullanılmış.
115 | - Path parametreleri (örneğin {id}), belirli bir kaynağa işaret etmek için kullanılmış.
116 | - Endpoint'lerde CORS kontrolleri ve güvenlik önlemleri düşünülmüş.
117 | - Query parametreleri (örneğin category) ile filtreleme sağlanmış.
118 | - Versiyonlama için özel bir endpoint eklenmemiş, ancak bu büyük projelerde gerekebilir.
119 |
120 | ## REQUEST İÇERİSİNDE AYNI PROPERTY’İ ALMAKTAN KAÇININ.
121 |
122 | 
123 |
124 | 
125 |
126 | ## Program.cs Dosyasının mümkün olduğunda sade bırak!
127 | Uygulama inşa edildikçe servisler artacak , katmanlar artacak ve bu iki kısımdaki
128 | kullanım da artmış olacak. Dolayısıyla Program.cs şişmeye başlar.
129 | ConfigureServices ve Configure yapıları extension metot içerisine taşımak gerekir.
130 | IServiceCollection içerisine extension metot yazıp çağırma işlemi gerçekleştirilebilir
131 |
132 | ## Uygulamanı Mümkün Olduğunca Küçük Parçalara Böl
133 |
134 | 
135 |
136 | ## Action Metotlarını temiz tutun Business Kodu bulundurmayın.
137 |
138 | 
139 |
140 | ## Hataları Global Olarak Ele Alın. Action metotlar içerisinde try catch blokları kullanmayın.
141 |
142 | 
143 |
144 | ## Entity Framework Core Code First Örneği
145 |
146 | Bu proje, Entity Framework Core'un Code First yaklaşımını kullanarak basit bir öğrenci-sınıf ilişkisini simgeliyor.
147 |
148 | ## Yüklenen Paketler
149 | Entity Framework Core ve SQL Server paketlerini ekleyin:
150 | ```bash
151 | dotnet add package Microsoft.EntityFrameworkCore
152 | dotnet add package Microsoft.EntityFrameworkCore.SqlServer
153 | dotnet add package Microsoft.EntityFrameworkCore.Tools
154 | ```
155 | - Entity Framework Core ve SQL Server için gerekli paketler eklenir.
156 |
157 | ## Kod Örnekleri
158 |
159 | ### Model Sınıfları
160 |
161 | Öğrenci ve Sınıf model sınıfları örnek:
162 |
163 | #### Student.cs
164 | ```csharp
165 | public class Student
166 | {
167 | [Key]
168 | public int Id { get; set; }
169 | public string FirstName { get; set; }
170 | public string LastName { get; set; }
171 | public string Email { get; set; }
172 | public string Telephone { get; set; }
173 | }
174 | ```
175 | #### AppDbContext.cs
176 | ```csharp
177 | public class AppDbContext : DbContext
178 | {
179 | public DbSet Students { get; set; }
180 | protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
181 | {
182 | optionsBuilder.UseSqlServer(@"Data Source=localhost;Initial Catalog=Northwind;Integrated Security=True");
183 | }
184 | }
185 | ```
186 |
187 | #### Program.cs
188 | ```csharp
189 | // See https://aka.ms/new-console-template for more information
190 | using EntityFrameworkCore.Models;
191 | using EntityFrameworkCoreExample.DataContext;
192 |
193 |
194 |
195 | using (var context = new AppDbContext())
196 | {
197 | //INSERT
198 | var student = new Student()
199 | {
200 | Email = "ruveydakardelcetin@gmail.com",
201 | FirstName = "Kardel",
202 | LastName = "Ruveyda",
203 | Telephone = "5305153061"
204 | };
205 |
206 | context.Students.Add(student);
207 | context.SaveChanges();
208 | Console.WriteLine("Veri tabanına başarılı bir şekilde eklendi!");
209 | Console.ReadLine();
210 |
211 | //Tolist
212 |
213 | var students = context.Students.ToList();
214 |
215 | foreach (var item in students)
216 | {
217 | Console.WriteLine(String.Join("Öğrenci adı : {0}", item.FirstName));
218 | Console.ReadLine();
219 | }
220 |
221 | ////UPDATE
222 | var studentUpdate = context.Students.Where(x => x.Id == 1).FirstOrDefault();
223 |
224 | if (studentUpdate != null)
225 | {
226 | studentUpdate.FirstName = "Aynur";
227 | studentUpdate.LastName = "Katırcıoğlu";
228 |
229 | context.Update(studentUpdate);
230 | context.SaveChanges();
231 |
232 | Console.WriteLine("Veri tabanına başarılı bir şekilde güncellendi");
233 | Console.ReadLine();
234 | }
235 |
236 | //Delete İşlemi
237 |
238 | List removeListIds = new List();
239 |
240 | removeListIds.Add(2);
241 | removeListIds.Add(3);
242 |
243 | bool isRemoved = false;
244 | string message = "Bir hata oluştu";
245 | try
246 | {
247 | foreach (var item in removeListIds)
248 | {
249 | var studentDelete = context.Students.Where(x => x.Id == item).FirstOrDefault();
250 | if (studentDelete != null)
251 | {
252 | context.Students.Remove(studentDelete);
253 | context.SaveChanges();
254 | isRemoved = true;
255 | message = "Silme işlemi başarılı.";
256 | }
257 | }
258 | }
259 | catch (Exception)
260 | {
261 |
262 | isRemoved = false;
263 | }
264 |
265 |
266 | if (isRemoved)
267 | {
268 | var studentNew = context.Students.Where(x => x.Id == 1).FirstOrDefault();
269 |
270 | if (studentNew != null)
271 | {
272 | studentNew.FirstName = "Test";
273 | studentNew.LastName = "Test2";
274 | studentNew.Email = "test3@gmail.com";
275 | studentNew.Telephone = "2124444444";
276 |
277 | context.Students.Update(studentNew);
278 | context.SaveChanges();
279 |
280 | message = "Hem silme hem güncelleme işlemi gerçekleşti.";
281 | isRemoved = true;
282 | }
283 | }
284 | Console.WriteLine(message);
285 | Console.ReadLine();
286 | }
287 | ```
288 |
289 |
290 |
291 |
292 |
--------------------------------------------------------------------------------
/modern-web-gelistirme-4.md:
--------------------------------------------------------------------------------
1 | ## Modern Web Geliştirme 4
2 |
3 | ## Veri Tabanı Temelleri ( Veri tabanı yönetim sistemleri)
4 |
5 | ### Neden Veri Tabanı?
6 |
7 | Günümüzün rekabetçi iş dünyasında, kurumların başarısı ve sürdürülebilirliği, aldıkları stratejik kararların doğruluğuna bağlıdır. Şirketlerin yanlış kararları düzeltme lüksü olmadığı gibi, bu durum faaliyetlerinin durmasına bile yol açabilir. Bu nedenle, doğru ve güvenilir kararlar almak için işletmeler, işlemlerini kaydedip analiz edebilecekleri veri tabanı sistemlerine yönelmişlerdir.
8 |
9 | Başlangıçta, veri tabanları zaman kazandırmak, raporlamaları kolaylaştırmak ve verilere hızlı erişim sağlamak amacıyla kullanılıyordu. Ancak, rekabetin artmasıyla birlikte veri tabanlarının işlevi genişledi; artık veriler analiz edilip, sonuçlar çıkarılarak karar alma süreçlerine katkıda bulunulmaktadır. Bu durum, iş dünyasının karmaşıklığını veri tabanı teknolojileriyle daha basit ve yönetilebilir hale getirmiştir.
10 |
11 | ### Veri Nedir?
12 |
13 | "Veri" ve "bilgi" terimleri sık sık birbirinin yerine kullanılsa da aslında farklı anlamlar taşırlar. Veri, olaylar, yerler, kişiler veya nesneler hakkında elde edilen ham gerçeklerdir. Bu veriler, bilgisayar ortamında işlenmemiş ve anlamlandırılmamış halde bulunur. Veri, genellikle manyetik diskler (örneğin, sabit disk) veya yarı iletken belleklerde (örneğin, RAM) saklanır.
14 |
15 | Bilgi ise işlenmiş, anlamlandırılmış ve kullanıcıya fayda sağlayacak hale getirilmiş veridir. Örneğin, bir şirketin çalışanlarının listesi ham bir veriyken, belirli bir departmandaki çalışanların raporlanması bilgiye dönüşmüş halidir.
16 |
17 | ### Veri tabanı Kavramı
18 |
19 | Veri tabanı, belirli kategorilere göre düzenlenmiş verilerin saklandığı bir yapıdır. Bu yapı, veriye hızlı ve güvenli bir şekilde erişim sağlamayı, verinin kim tarafından nasıl kullanılacağını yönetmeyi amaçlar. Ayrıca veri tabanları, verilerin düzenli ve verimli bir şekilde saklanmasını sağlar. Büyük Veri (Big Data) kavramı ise veriyi analiz etmek ve anlamlandırmak üzerine odaklanır. Bu noktada, veri tabanlarının yapıları ve işlevleri genişlemekte, karmaşık veriler anlamlı hale getirilmektedir.
20 |
21 | Veri tabanları, banka, hastane, üniversite gibi büyük kuruluşlarda önemli iş süreçlerinin yönetilmesi ve raporlanması için kullanılır. Örneğin, bir banka müşterilerinin hesap bilgileri, bir hastane ise hasta kayıtlarını veri tabanında saklar. Veri tabanları, verilerin merkezi ve tutarlı bir şekilde yönetilmesini sağlar.
22 |
23 | ### Neden veri tabanı kullanılır?
24 |
25 | Bilgiye hızlı, güvenli ve düzenli bir şekilde erişebilmek için çeşitli veri yönetim yaklaşımları geliştirilmiştir. Geleneksel dosya tabanlı sistemler, her bir veri setini ayrı dosyalarda tutarken, bu sistemlerdeki veriye eşzamanlı erişim ve değişiklik yapma zorlukları nedeniyle yetersiz kalmışlardır. Bu sorunlar, veri tabanı yönetim sistemlerinin geliştirilmesine yol açmıştır. Veri tabanları, verilerin merkezi olarak yönetilmesini, veri tekrarının azaltılmasını ve verilerin daha güvenli bir şekilde saklanmasını sağlar.
26 |
27 | ### Veri tabanı yaklaşımının avantajları
28 |
29 | - Veri paylaşımının gerçekleşmesi,
30 | - Ortak verilerin tekrarlanmasının önlenmesi,
31 | - Verilerin merkezi denetim ve tutarlılığının gözlem altında tutulması,
32 | - Güvenlik ve gizliliğin kullanıcıların istediği düzeyde tutulması,
33 | - Verilerin kolay ve anlaşılır yapıda olmasını sağlayabilmesi
34 | - Yazılım geliştirmeye sağladığı katkı ile, tasarım ve geliştirmenin kolaylaşması
35 | - Yedekleme, onarma, yeniden başlatma gibi işletim sorunlarına çözüm getirebilmektedir [2]. Özellikle yedekleme özelliğini sağlaması ile birlikte veri tabanları; birçok kullanıcının sorunlarına çözüm olmuştur. Çünkü çoğu kullanıcı verilerini saklamakta başarılı olamadığı için, bazı durumlarda verilerini kaybedebilir. Ancak veri tabanlarının yedekleme özelliği var ise, kolayca kaybedilen verilere ulaşılabilir.
36 |
37 | ### Veri tabanı yönetim sistemi nedir?
38 |
39 | Veri tabanlarının oluşturulması, yönetimi, güncellenmesi ve verilerin işlenmesi için kullanılan sistemlere Veri Tabanı Yönetim Sistemi (DBMS) denir. Bu sistemler, verilerin fiziksel olarak nasıl depolanacağını yönetirken, kullanıcılara standart bir SQL (Structured Query Language) arayüzü sunarak veriye erişim ve veri işleme süreçlerini kolaylaştırır.
40 |
41 | DBMS, kullanıcıların veri yapısı ve depolama gibi detaylarla uğraşmasına gerek bırakmaz, verilerin güvenli ve verimli bir şekilde saklanmasını sağlar. Ayrıca, sistemdeki kullanıcılar, roller ve erişim yetkileri, veri tabanı yöneticisi tarafından denetim altında tutulur.
42 |
43 | ### Veri tabanı yönetim sistemi amacı nedir?
44 |
45 | Veri tabanı yönetim sisteminin amacı, yazılım geliştirilmesinde kullanılan veri tabanının yönetimini, performans ölçümlerini ve güvenliğini sağlamaktır. Veri tabanı yönetim sistemleri fiziksel hafızayı ve veri tiplerini kullanıcılar adına şekillendirip denetledikten sonra kullanıcılara standart bir SQL ara yüzü sağlayarak; onların veri yapısı, fiziksel hafıza gibi sorunlarınla ilgilenmek yerine veri giriş-çıkışı olanağını sağlayan yazılımlar olarak bilinmektedirler . Her yönetim sisteminde kullanıcılar, roller ve gruplar vardır ve bu verileri tutmak üzere birçok türde nesne ve bu nesnelere erişim onayı veri tabanı yöneticisi tarafından denetim altında tutulmaktadır [2]. Veri tabanı yöneticisi kontrolü altında verilen haklar arttırılabilir, kısıtlanabilir veya silinebilir.
46 |
47 | ### Veri tabanı yönetim sisteminin sağladığı yararlar
48 |
49 | - Programcı kullandığı verilerin yapısını, organizasyonunu ve yönetimini kendisi hazırlamak zorunda kalmaz çünkü veri tabanı bunları kendiliğinden koordine eder ve yönetir.
50 | - Verilerin yanlış kullanım veya kasıtlı bozulması sonucunda bozulmasını engellemek ve önlemek,
51 | - Bir tabloda işlem yapıldığında diğer tabloda da buna bağlı olarak işlemlerin yapılmasını sağlar. Çünkü veri tabanı yönetim sistemi, bu tabloların birbirleriyle ilişkilendirilmesini sağladığı için, herhangi bir tabloda yapılan değişiklik diğer tabloyu etkileyebilir.
52 | Veri tabanı yönetim sistemini kullanmayan kullanıcılar veriye erişim sınırı ile karşı karşıya gelebilir ve birden çok veriye aynı anda erişemezler. Bu sistemi kullananlar kullanıcılar ise verinin tutarlılığını ve bütünlüğünü bozmadan ayanı veri tabanlarına saniyede yüzlerce, binlerce erişim yapabilir.
53 | Veri tek bir merkezde tutulabilir, böylece verinin değişik bilgisayarlarda tekrar tekrar saklanılmasına gerek duyulmaz.
54 |
55 | ### Veri yabanı yönetim sistemleri
56 |
57 | - Access (Microsoft)
58 | - Adabas D (Software AG)
59 | - Cloudscape (Informix)
60 | - Advantage Database Server (Extended Systems)
61 | - Data com (Computer Associates)
62 | - DB2 (IBM)
63 | - Interbase (Inprise)
64 | - MySQL (Freeware)
65 | - Oracle 8I (Oracle)
66 | - PostgreSQL (Freeware)
67 | - Rdb (Oracle)
68 | - Red Brick (Informix)
69 | - SQL Server (Microsoft)
70 |
71 |
72 | ### Veri tabanı modellemesi
73 |
74 | - Herhangi bir veri tabanına kayıt edilmiş veya kaydedilecek verilerin; birbirleri ile arasındaki ilişkilerin verilere nasıl erişeceğini tasarlayan yapıya veri tabanı modellemesi denmektedir. Başarılı bir veri tabanı uygulaması için belirli aşamalardan geçilmesi gerekir. Bu aşamalardan en önemlisi kavramsal modellemedir.
75 | Dünyada üretilen bütün verileri bir veri tabanına kaydetmek mümkün değildir. Bu verilerin kaydı gerçekleşse bile, büyük çoğunluğu işe yaramayacaktır. Bu yüzden veriler içerisinden işe yarar olanları seçilmeli ve bunlar üzerinde kayıtlandırmalar yapılmalıdır.
76 | - Örneğin, “Bir üniversiteye ait veri tabanında öğrencilerin şahsi arabalarının markası ya da kullandıkları cep telefonu markalarının yer alması üniversitenin işine yarayacak mı? ”gibi bir sorunun cevabı aşikardır. Tabiki de bir üniversite veri tabanında böyle bir bilgiye gerek yoktur. Eğer veri tabanını hazırlarken işletmeler kendilerine bu tarz sorular soruyorlarsa, veri tabanının tasarlanmaya başlanarak modelleme yapıldığı anlaşılabilir.
77 | - Veri tabanı hazırlanırken öncelikle veri tabanında hangi verilerin tutulacağı belirlenmelidir. Veri tabanı tasarımında hazırlama aşamasında kullanılan en yaygın yöntem, varlık-ilişki diyagramlarıdır. Örneğin, bir tekstil fabrikası veri tabanını düşündüğümüzde bir çalışanın birden fazla departmanda çalışıp çalışamayacağını belirleyen verilere “yapısal” veriler denir. Yapısal verilerde varlıklar arasındaki ilişkiler ve özellikler (alanlar ve tablolar) önceden belirlenmiştir. Bunların dışında veri tabanına girilemez veya saklanamaz. Son yıllarda yaygınlaşan bilgisayar ve internet teknolojileri ile birlikte veriler doğrudan elektronik ortamlarda bilgisayarlar üzerinde üretilmeye başlandı. Örneğin, internet üzerinden yatırılan kredi kartı borçları veya elektronik alışveriş gibi faaliyetlerde internet üzerinde veri tabanları oluşturulur. Bu veri tabanları “yapısal olmayan” veriler olarak adlandırılır
78 | - Modelleme için güzel bir web sitesi -> https://dbdiagram.io/
79 |
80 | ### Veri tabanı Türleri
81 |
82 | Veri tabanı Türleri üç kısımda incelenmektedir. Bu veri tabanları Hiyerarşik Veri tabanları, İlişkisel Veri tabanları ve Nesnesel Veri Tabanları’ dır.
83 |
84 | **Hiyerarşik veri tabanları**
85 |
86 | Hiyerarşik Veri Tabanları, veriyi işlemek ve depolamak için geliştirilmiş olan ilk veri tabanı modeli olarak bilinmektedir. Bu modelde, kök düğüm yani root node haricinde kalan bütün düğümler, kendisinden bir üst düğüme bağlanmak zorundadır. Temelinde Binary Search metodu bulunmaktadır. Hiyerarşik veri tabanları, dünya genelinde yaygın bir kullanıma kavuşmamıştır. Anlaşılacağı üzere hiyerarşik veri tabanları, günlük hayatta yaygın olarak kullanılmamaktadır.
87 |
88 |
89 | 
90 |
91 | **İlişkisel Veri Tabanları**
92 |
93 | Günümüzde bilgisayar ortamlarında tutulan ilişkisel veri tabanlarının mantığı aslında geçmişte kullanılan kayıt defterlerinin mantığına benzemektedir. Eskiden elektronik ortamda verilerin tutulması pek mümkün olmadığı için; çoğu kurum ve kuruluş, kayıtlarını kayıt defterlerinde tutmuş ve bunları arşivlerde saklamışlardır. İlişkisel veri tabanları, verilerin operasyonel olarak tutulduğu bir model biçimidir. Ayrıca bu model, hız ve kolaylık açısından avantaj kazandırmaktadır. İlişkisel veri tabanları ile diyagramlar oluşturulup, aralarındaki ilişkiler daha net bir şekilde görülebilir. Bu diyagramlar SQL Server ortamında oluşturulabileceği gibi; Microsoft Access, Microsoft Visio gibi platformlarda da oluşturulabilir.
94 |
95 | **Nesnesel Veri Tabanları**
96 |
97 | İlişkisel veri tabanları bünyesinde birçok mantıksal nesne bulundurmaktadır. Bu ilişkisel veri tabanlarında en önemlileri Indeks (Index) ve Tablo (Table) olarak bilinmektedir. Nesnesel veri tabanlarını daha somut bir şekilde açıklamak gerekirse, veri tabanı içerisinde tutulan her bir tablonun verileri birbirinden farklıdır. Bu veriler arasındaki ilişkilerin kurulduğu bir başka tablo daha olabilir. Örneğin, müşteri tablosunda bulunan “müsteri_adi” kolonu, şehir tablosunda da olabilir ve bu iki tablo arasında bir ilişki kurulabilir. Ve buna göre veri tabanlarında “Primary Key (Birincil Anahtar)” ve “Foreing Key”ler oluşturulur. Veri tabanlarının içerisinde nesneleri tutan şemalar ve sistem tabloları bulunmaktadır. Bunların hepsine META-DATA denilir.
98 |
99 |
100 |
101 |
--------------------------------------------------------------------------------
/modern-web-gelistirme-8.md:
--------------------------------------------------------------------------------
1 | # SOLID Prensipleri
2 |
3 | - Solid prensipleri ile ilgili bilmemiz gereken ilk nokta gelecekte karşımıza çıkacak işlemler için kodumuzun kalitesinin artmasında fayda sağlayacak prensiplerdir. Başarılı bir şekilde uygulayabilirsek gelecekte karşımıza çıkacak değişikliklere en iyi şekilde entegre olmak SOLID ile daha kolay olacaktır.
4 |
5 | ### Single Responsibility Prensibi
6 | - Bir şeyi yapabiliyor olmamız her şeyi yapmamız gerektiği anlamına gelmemektedir. Metot yazarken de bu yaklaşımla ilerlemeliyiz. Bir metotun bir sorumluluğu olsun sadece bir iş yapsın mantığında ilerlemek gün sonunda daha doğru olabilir.
7 | - "Single Responsibility Principle" (SRP), yazılım geliştirme alanında SOLID prensiplerinden biridir. SOLID prensipleri, yazılım tasarımındaki temel prensipleri düzenler ve sürdürülebilir, esnek ve bakımı kolay sistemler oluşturmayı amaçlar. Single Responsibility Principle (Tek Sorumluluk Prensibi), Robert C. Martin'in belirttiği beş SOLID prensibinden biridir. Bu prensip, bir sınıfın yalnızca bir nedenle değişebileceğini ve bir sınıfın sorumluluklarının tek bir konsepte odaklanması gerektiğini savunur. Bu, bir sınıfın sadece bir tür görevi veya sorumluluğu olması gerektiği anlamına gelir. İdeali, bir sınıfın değişiklik nedeni sadece bir tane olmalıdır. Eğer bir sınıf birden fazla sorumluluğu üstlenirse, bu sınıfın herhangi bir sorumluluğundaki bir değişiklik diğer sorumlulukları etkileyebilir ve bu da kodun karmaşıklığını ve bakım zorluğunu artırabilir.
8 |
9 | **SRP'nin avantajları şunlar olabilir:**
10 |
11 | **1. Daha İyi Bakım ve Anlaşılabilirlik:** Sınıfların tek bir sorumluluğa odaklanması, kodun daha anlaşılabilir ve bakımı daha kolay olmasını sağlar. Bu sayede, bir sınıfın içindeki değişikliklerin diğer kısımları etkileme olasılığı azalır.
12 |
13 | **2. Daha Az Bağımlılık:** Sınıflar arasındaki bağımlılıkların azaltılması, kodun daha esnek ve değiştirilebilir olmasını sağlar. Bir sınıfın içinde yapılan değişiklikler, diğer sınıfları minimum düzeyde etkiler.
14 |
15 | **3. Kodun Tekrar Kullanılabilirliği:** Sınıfların tek bir sorumluluğa odaklanması, bu sınıfların daha genel amaçlı ve yeniden kullanılabilir olmasını sağlar. Bir işlevselliği değiştirmek istediğinizde, sadece ilgili sınıfı değiştirmeniz yeterli olacaktır.
16 |
17 | Örneğin, bir sınıfın hem veritabanı işlemlerini yönetmesi hem de kullanıcı arayüzü işlemlerini gerçekleştirmesi durumunda, bu sınıf SRP'ye uymuyor demektir. İdeal olarak, bu sorumluluklar iki ayrı sınıfa ayrılmalıdır.
18 |
19 |
20 |  | 
21 | :-------------------------:|:-------------------------:
22 | Single Responsibility | Robert C. Martin
23 |
24 |
25 | ### Open Closed Prensibi
26 | - Yazdığımız kodların geliştirmeye açık olmalıdır ancak değişime kapalı olmalıdır.
27 | - "Open/Closed Principle" (OCP), SOLID prensiplerinden biridir ve yazılım tasarımındaki iyi bir uygulama pratiğini temsil eder. Bu prensip, **Bertrand Meyer** tarafından ortaya atılmıştır ve yazılım tasarımında esneklik ve genişletilebilirlik sağlamayı amaçlar.
28 | - Open/Closed Principle (Açık/Kapalı Prensibi), şu şekilde ifade edilir: **"Bir yazılım birimi (sınıf, modül, fonksiyon, vb.) genişletmeye açık, değişikliğe kapalı olmalıdır."** Bu ilkeye göre, bir yazılım birimi, yeni özellikler eklemek veya davranışını değiştirmek için açık olmalı, ancak mevcut davranışlarını değiştirmek için kapalı olmalıdır.
29 | - Bu prensip, yazılım birimlerinin (genellikle sınıfların) uzantılarına açık, ancak mevcut kodlarında yapılan değişikliklere kapalı olması gerektiğini savunur. Yani, yeni bir özellik eklemek veya davranışı değiştirmek, mevcut kodu değiştirmek yerine, var olan kodu uzatarak yapılmalıdır.
30 |
31 | **1. Genişletilebilirlik:** Yazılım birimleri, yeni gereksinimlere veya özelliklere uyum sağlamak için kolayca genişletilebilir. Yeni bir özellik eklemek istendiğinde, var olan kod değişmeden yeni bir kod eklenerek genişletme yapılabilir.
32 |
33 | **2. Daha Az Riskli Değişiklikler:** Mevcut kodun değişmeden kalması, hali hazırda çalışan sistemi etkileme riskini azaltır. Bu, birim testlerin daha güvenilir olmasına ve kod değişikliklerinin daha güvenli bir şekilde yapılmasına olanak tanır.
34 |
35 | **3. Daha Yüksek Uyum Sağlama:** OCP, birimlerin daha iyi bir şekilde uyum sağlamasını sağlar. Yeni özellikler eklemek, mevcut kodu değiştirmeksizin gerçekleştirilebileceği için, yazılım birimleri daha esnek ve yeniden kullanılabilir olabilir.
36 |
37 | OCP, diğer SOLID prensipleriyle birlikte kullanıldığında, daha modüler, sürdürülebilir ve esnek yazılım tasarımları elde etmeye yardımcı olabilir.
38 |  | 
39 | :-------------------------:|:-------------------------:
40 | Open Closed | Bertrand Meyer
41 |
42 | ### Liskov Substitution Prensibi
43 | - Bu prensip bize der ki bir class inherit edildiği class gibi davranamıyorsa burada bir ihmal vardır. Abstraction ile ilgili yaptığımız bir sorun var demektir.
44 | - Elimizdeki class inherit ettiğimiz class gibi davranıyorsa ve bu class içerisindeki bütün metotlara sahipse ve kullanabiliyor ise herhangi bir sorun yoktur. Çünkü ola ki bir durumda ben inherit edilen class yerine inherit eden classı kullandığımda sıkntı çıkmaması gerekiyor.
45 | - LSP'nin ana ilkesi, bir türetilmiş sınıfın, temel sınıfın yerine geçebilmesi ve aynı arayüzü sağlaması gerektiğidir. Bu prensip, **Barbara Liskov** tarafından 1987 yılında **"A Behavioral Notion of Subtyping"** adlı makalede ortaya konulmuştur. LSP'nin temel ifadesi şu şekildedir: **"S, T'nin bir alt türü ise, T türünden nesnelerin yerine S türünden nesneler kullanılabilir olmalıdır."**
46 |
47 | **1. Alt Sınıfların Özel Durumlar Oluşturmaması:** Alt sınıflar, temel sınıfların davranışlarını değiştirmemeli ve temel sınıfların yerine geçebilmelidir. Alt sınıflar, temel sınıfların kullandığı arayüzleri aynı şekilde desteklemelidir.
48 |
49 | **2. Miras Alan Sınıfların Davranışlarını Genişletme:** Alt sınıflar, temel sınıfların davranışlarını genişletebilir ancak değiştiremez. Yani, temel sınıflardan gelen özellikleri kullanabilir ve ihtiyaç duydukları özellikleri ekleyebilirler.
50 |
51 | LSP'nin bu kuralları, türetilmiş sınıfların kullanımının güvenli olmasını sağlar ve kodun daha öngörülebilir olmasına katkıda bulunur. Bu prensip, polymorphism (çok biçimlilik) konseptiyle de ilişkilidir. Eğer bir sınıf, bir üst sınıfın yerine geçebiliyorsa, bu durumda polymorphism kullanılabilir ve bu nesneleri bir arayüz üzerinden kullanmak daha kolay hale gelir. LSP'nin amacı, türetilmiş sınıfların kullanımını güvenli ve sorunsuz hale getirerek, yazılımın esnek ve sürdürülebilir olmasına katkıda bulunmaktır.
52 |
53 |  | 
54 | :-------------------------:|:-------------------------:
55 | Liskov Substitution | Barbara Liskov
56 |
57 | ### Interface Segregation Prensibi
58 |
59 | Interface Segregation Principle" (ISP), SOLID prensiplerinden biridir ve arayüzlerin (interfaces) mümkünse mümkün olduğunca özel olması gerektiğini savunur. Bu prensip, bir sınıfın kullanmadığı metotlara sahip bir arayüzü uygulamamasını önerir ve müşterilerin yalnızca ihtiyaçları olan metotları içeren küçük arayüzleri kullanmalarını teşvik eder. ISP'nin temel prensibi şu şekildedir: **"Bir sınıf, ihtiyaç duymadığı metotları içeren bir arayüzü uygulamamalıdır."** Bu ilkeye göre, bir sınıf yalnızca kendi ihtiyaçlarına uygun olan metotları içeren arayüzleri uygulamalıdır. Böylece, bir sınıfın gereksinim duymadığı metotlarla bağlantılı olması ve bu metotları boş bir şekilde implemente etmesi önlenmiş olur.
60 |
61 | **ISP'nin avantajları şunlar olabilir:**
62 |
63 | **1- Daha Az Bağımlılık:** Bir sınıf, yalnızca ihtiyaç duyduğu metotları içeren küçük arayüzleri uygulayarak, diğer sınıflara olan bağımlılığını azaltabilir.
64 |
65 | **2- Esneklik ve Bakım Kolaylığı:** İhtiyaç duyulan metotları içeren küçük arayüzler, kodun daha esnek ve bakımı daha kolay olmasını sağlar. Bu sayede, değişiklikler yapıldığında sadece ilgili sınıflar etkilenir.
66 |
67 | **3- Kodu Anlama ve Kullanma Kolaylığı:** Müşteriler, yalnızca ihtiyaç duydukları metotlara sahip arayüzleri kullanarak kodu daha iyi anlayabilir ve kullanabilirler.
68 |
69 | Örneğin, bir arabayla ilgili bir arayüzde "Uçak Modu" gibi uygulanması gereksiz veya kullanılmayacak metotlar varsa, bu arayüzü implemente eden araba sınıfları için bu metotlar anlamsız olacaktır. Bu durum, ISP'nin ihlali olarak kabul edilebilir ve bu tür durumlar kaçınılmalıdır. Sınıflar, ihtiyaçlarına uygun ve anlamlı metotları içeren arayüzleri uygulayarak bu prensibi takip etmelidir.
70 |
71 |  | 
72 | :-------------------------:|:-------------------------:
73 | Interface Segregation | Interface Segregation
74 |
75 | ### Dependency Inversion Prensibi
76 |
77 | - Daha üst seviyede bir class alt seviyedeki bir classa bağımlı olmamalı. Çünkü bu bağımlılıkların sayısı arttıkça bunlardan kurtulma olasığımız azalabilir ve karmaşıklığa yol açılabilir. Dependency Inversion prensibi, SOLID prensiplerinden biridir ve yazılım tasarımında kodun esnekliğini ve sürdürülebilirliğini artırmayı amaçlar. Dependency Inversion prensibi, yüksek seviyeli modüllerin düşük seviyeli modüllere bağımlı olmamalıdır. İki modül de soyutlamalara bağlı olmalıdır.
78 |
79 | **Dependency Inversion prensibi üç ana ilkeye dayanır:**
80 |
81 | **1- Yüksek Seviyeli Modüller (High-Level Modules) ve Düşük Seviyeli Modüller (Low-Level Modules)**
82 | - Yüksek seviyeli modüller, uygulamanızın temel iş mantığını oluşturan ve genellikle daha soyut düzeydeki modüllerdir.
83 | - Düşük seviyeli modüller, daha spesifik ve uygulama detaylarına odaklanan modüllerdir.
84 |
85 | **2- Soyutlamalara Bağımlılık (Dependency on Abstractions)**
86 | - Yüksek seviyeli modüller, düşük seviyeli modüllere doğrudan bağımlı olmamalıdır. Bunun yerine, her iki seviyedeki modüller de soyutlamalara (interface veya abstract class gibi) bağımlı olmalıdır.
87 | - Bu, modüller arasında gevşek bağlantılar sağlar, çünkü yüksek seviyeli modül düşük seviyeli modülü somut bir uygulama yerine soyut bir kavram üzerinden kullanır.
88 |
89 | **3- Çalışma Prensibi**
90 |
91 | - Yüksek seviyeli modüller ve düşük seviyeli modüller, her ikisi de soyutlamalara bağımlı olduklarından, değişiklikler bir modülde yapıldığında diğerini etkilemez.
92 | - Bu prensip, kodun değişikliklere daha dayanıklı, esnek ve sürdürülebilir olmasını sağlar.
93 |
94 | 
95 | :-------------------------:
96 | Dependency Inversion
97 |
98 |
99 | ## Kaynakça
100 |
101 | - https://www.youtube.com/watch?v=oLVETlMyJZM
102 | - https://www.youtube.com/watch?v=kF7rQmSRlq0&t=3s
103 | - https://gokhana.medium.com/solid-nedir-solid-yaz%C4%B1l%C4%B1m-prensipleri-nelerdir-40fb9450408e
104 | - https://www.freecodecamp.org/news/solid-principles-explained-in-plain-english/
105 |
--------------------------------------------------------------------------------