├── 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 | ![{4774DCFE-6C7D-48AF-B4D0-257614D12186}](https://github.com/user-attachments/assets/d4a156b2-9ad7-40a3-8fe5-208720b0ba1b) 7 | ![{A0D675E7-397B-4019-9A2C-AF53DC4C1475}](https://github.com/user-attachments/assets/86956acf-f441-4792-a0cc-5d331df07bb5) 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 | ![image](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/assets/33912144/f7f66973-4c40-4838-aff7-4ecb9ac08715) 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 | ![image](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/d714109f-1839-4911-ab08-ad73ae2f2f12) 39 | ![image](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/5732699c-4441-4e05-9b39-304c982c8361) 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 | ![image](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/assets/33912144/de8f5bae-02b9-43cf-a76d-f97ac5eccd3e) 13 | 14 | ### SQL Sistemleri 15 | 16 | ![image](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/assets/33912144/2509b971-821d-426a-848f-958565570d4a) 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 | ![Picture10](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/assets/33912144/72779678-e1e7-4457-a22c-ff0fc703c4f2) 43 | 44 | ![image](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/assets/33912144/3714ce78-893d-4251-9600-6b35aee6a87c) 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 | ![image](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/assets/33912144/688260aa-caed-4c1e-bf46-b714f4201027) 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 | ![image](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/assets/33912144/f2a38a26-e0e0-4641-a24e-ee52ce67a74e) 98 | 99 | ![image](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/assets/33912144/e5b519af-ba17-446b-94bb-1bc9b0c379e0) 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 | ![image](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/fd0d323f-cf34-45b0-9fc2-a49eec1d8901) 123 | 124 | ![image](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/9b424ae8-18d0-4df6-baa0-fd1d1263d03c) 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 | ![image](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/f9490c28-b7e4-44a1-8ff0-9c597fdf9291) 135 | 136 | ## Action Metotlarını temiz tutun Business Kodu bulundurmayın. 137 | 138 | ![image](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/58562c0c-7833-44a3-a83e-0392e658bf0b) 139 | 140 | ## Hataları Global Olarak Ele Alın. Action metotlar içerisinde try catch blokları kullanmayın. 141 | 142 | ![image](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/b380a4a2-9665-4dfb-8733-38160d986968) 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 | ![image](https://github.com/KardelRuveyda/sektor-kampuste-sanayi-bakanligi/assets/33912144/bac7f702-e045-4e29-b768-044b62e1af0e) 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 | ![Resim 1](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/e4ea7f32-5b1d-4e67-af51-933074f13f7c) | ![Resim 2](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/f540793c-b2f4-4435-8a9f-2235212116b5) 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 | ![Resim 3](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/7939f24e-f1ab-4951-b506-99f21767d422) | ![Resim 4](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/30a69435-f63c-4760-bdc3-4ff2bb77c318) 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 | ![Resim 3](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/0f27941f-92d9-4da4-ab6e-d7ef18102652) | ![Resim 4](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/cf1a549e-62a5-4ee9-82a2-e2d876b53294) 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 | ![Resim 3](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/af1bfe69-7e93-4bb6-8a13-597e8e9438f4) | ![Resim 4](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/5a823a2a-6acf-4393-8661-16eac1c030d8) 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 | ![Resim 3](https://github.com/KardelRuveyda/dotnet-yuzuncuyil-egitim-notlari/assets/33912144/b9bc6939-c6e4-42cd-80ce-c97e0b730ff3) 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 | --------------------------------------------------------------------------------