Henrik Høltzer (heho)
Software Construction - SWC 1.2 2B

Semester: 2.sem., forår 2020
Email: heho@zealand.dk

Materialer generelt:

Noter:

Object-Oriented Programming with C# (findes på GitHub her)


Opgaver:

C# Programming Exercises (findes på GitHub her)

Unsolved exercise projects

Solved exercise projects


Supplerende materiale:

Microsoft Visual C# Step by Step (8th ed.), by John Sharp (ISBN: 9781509301041)

NB: Bogen er IKKE pensum

 

Video

LinkedIn Learning (Lynda.com) (Gratis adgang; tilmeld med din skole e-mail konto: https://www.linkedin.com/learning/activate) (SWC Lynda.com Playlist)

MS Academy: C# Fundamentals for absolute beginners

 

 

Link til 1. semester: Software Construction - SWC 1.1 1B

Uge Emner Materialer Opgaver
6 Brush Up


O1: EventMaker
RelayCommand.cs
RelayArgCommand.cs

The MVVM CookBook .docx
MVVMv2.docx

Solutions:

EventMakerV2.zip

7
Brush Up (cont.),
Inheritance
Polymorphism
Interface





Inheritance (Arv), Interface + Abstract class:
Noter: s.111-122

(Bog: Kap. 12, 13, 6 (i den orden))

Slides: Inheritance and Polymofism


Exercise:
O2: BrushUp

O3: ISpeak (Philosopher)

O4: OOP.2.7


Solutions:
ISpeak.zip

8 Ingen UV i SWC    
9

Error/Exception
Unit Test
(flyttes til uge 9)

Stack ADT (Abstract Data Type)
Generics
Queue (ADT) Using Collections

IComparable / IComparer
Equals( ) / GetHashCode( )

Exceptions:
Noter: s.129-133 (MSVC#: Chap. 6 )
Exceptions and Exception Handling in C#

MSDN: Best Practices for Exceptions

Generics:
Noter: s.194-207 (
MSVC#
: Chap. 17p. 369-375)

Collections:
Noter: s.223-227 (MSVC#:
Chap 18. 399-411)

Collections-Overview
An Overview Of System.Collections.Generic
MSDN: IComparable
MSDN: IComparer

Video:

What is IEnumerable,IComparable And IComparer Interfaces in C#?
Visualization and Comparison of Sorting Algorithms

Exercise:
O5: Exceptions-Stack
O7: MyGenericStack
O6 Exceptions-UnitTest (flyttes til uge 9)


C#-Projects:
MyStack.zip

Exercise:
O8: Circular List
O9: CollectionsSort
O10: GenericCollectionsAndDictionarys

C#-Projects:
CollectionSortTest.zip

Solutions:
CircularList
CollectionsSort.zip

10

Predicate Deligates
Anonymous functions
Lambda-expressions
IEnumerable / IEnumerator

LINQ

Functions as parameters (Delegates, Predicates and Lambda):
Noter: s.208-218

Bemærk:

Predicate deligates og anonyme funktioner er lidt "tungt" stof ;)

CodeProject: Understanding Predicate Delegates

Videos:
Anonymous methods in c#

Lambda expression in c#
Func delegate in c# ** bemærk extra !! **


MSDN: Anonymous Methods
MSDN: Delegates
MSDN: Predicate <T> Delegate
MSDN: Lambda expressions
DotnetPerls: C# Lambdas

LINQ:
Noter: s.232-241 (Bogen: MSVC#
: Chap. 21p.469-481)
WizIQ : LINQ - Language INtegrated Query (slides)
MSDN: Introduction to LINQ
MSDN: 101 LINQ Samples

Videos:
LINQ
Part 1 What is LINQ
Part 2 Writing LINQ queries
Part 3 Extensions Methods in C#
Part 4 LINQ Aggregate Functions

Exercise:
O11: LambdaExpressions
O12: LinqHotelExercice.zip

C#-Projects:
DeligateTest.zip
PredicateDeligateTest.zip
LinqTest.zip

Solutions:
LinqHotels.zip
LambdaExpressions.zip

Bemærk
Som I jo nok ved lukkede skolen fysisk torsdag d. 12.3 kl. 12.00 - men vi fortsætter online og vil benytte MS Teams
Første gang er fredag d. 13.3 kl. 10.00
11

Design Patterns

  • Decorator
  • Factory
  • Observer
  • Adapter
  • State
  • mm.

Lynda.com:
Foundations-Programming-Design-Patterns

Design patterns explained 
Illustrated designpatterns: 1 2 3 4 5

Code-project: Strategy Pattern-C#


DesignPatterns (Note)

Exercise O20:

PizzaShop

C#-Projects:
PizzaDesignPatterns (løsning til PizzaShop)

Tirsdag d. 17/3 - kl 9.30
Dagens Program:

  • Jeg går på kl. 9.30 og starter med at give en kort gennemgang af løsningen til PizzaShop.
  • Dernæst in kort introduktion til Databaser (slides).
  • Efter denne korte introduktion viser jeg hvordan vi kan oprette en ny Database i VS2019.
  • Dernæst gennemgår jeg "Code first to Existing DB", hvor jeg viser hvordan vi kan benytte Entity Framework til at autogenerere Modelklasser og DBContext (forbindelsen til DB).
  • Til sidst viser jeg hvordan vi fra et Consol-projekt kan benytte LINQ til lave forespørgsler og opdateringer på databasen.

Herefter bliver der opgaveløsning.
Jeg vil foreslå at i arbejder gruppevis eller parvis (benyt evt MS LiveShare: https://visualstudio.microsoft.com/services/live-share/)
Jeg har lavet et GoogleDoc som vi kan benytte til HjælpeListe: https://docs.google.com/document/d/17Bs9PtEJNdk5BKy2FY76vs6ibLi8W3IKkljy6YPAhb8/edit - hvis man skriver sig på inviterer jeg på tur til at joine en privat kanal i MT Teams.

12 Database intro
Entity Framework

Web API 2
DB intro (slides)

MSDN: Entity Framework Development Workflows
Channel9-MSDN: Code First to Existing Database
MSDN: Code First to a New Database



Exercise: O13
Code First - Existing Database
Create your own DB using Visual Studio
(eg a TradeDB with the following tables: Product, Customer, Order and Orderline)
Insert som data.
Watch the video:
Code First to Existing Database

Use ADO.NET Entity Data Model -> Code First From Database to generate your model clases.
Use LINQ to query and manipulate the database.

Test all CRUD - operations (Create/Add, Read/query, Update, Delete/Remove)

Fredag d. 20/3 - kl 9.15
Dagens Program:

  • Jeg går på kl. 9.15 og starter med at give en kort status opdatering.
  • Så kommer der en kort gennemgang af opgaven fra i tirsdags.
  • Introduktion til dagens opgave.

Det er rigtigt vigtigt at vi får gang i online Team-arbejdet nu! - om kort tid skal I arbejde med jeres gruppe-projekt og her er det ekstremt vigtigt at I har styr på jeres Team-værktøjer. Jeg tror ikke på at skolen åbner igen inden projektperioden er startet!. I skal allerede nu begynde at få styr på jeres arbejdsmetoder/rutiner og få aftalt "møder" og "møde-kultur" lavet aftaler for hvordan i samarbejder mm.

TeamWork: https://www.instagram.com/p/B96_5WDH8hl/?igshid=1k15v4ytapvme&fbclid=IwAR1tSXNub9Qt-KcsG1pUzA-lbYl86tqaon0EDQtMf-KJUykgBtBTuzzGguw

    MS LiveShare: https://visualstudio.microsoft.com/services/live-share/

Forslag:
Når I sidder derhjemme og keder jer, så se evt.: https://www.linkedin.com/learning/git-essential-training-the-basics/view-the-commit-log?u=37487420

og læs: How to use Github in VS2019

og se evt følgende GitHub Video Tutorial (By Mohammed):

Gruppeopgave: MS-Live-Share.html

Exercise: O14
Create a wiew in the Database eg. Customer.Id, Customer.Name, Product.Name, Orderline.Count

Use Entity framework to generate classes and DBContext to the wiew and test it in the console.

 

C#-Projects:
PersonCarTestDB.zip (Kode demonstreret i "klassen")

Tirsdag d. 24/3 - kl 9.15
Dagens Program:

  • Jeg går på kl. 9.15 og starter med at give en kort status opdatering.
  • Kort repetition af fredagens opgave
  • Først skal vi have oprettet HotelDB i VS2019 vha sql-scripts
  • Dernæst en gennemgang af hvordan der genereres en Webservice vha Entity Framework
  • Samt en gennemgang af hvordan en Webservice kan anvendes via en Consol-applikation til at få adgang til HotelDB

Arbejde med opgaven: Exercise O17

13

 

Web API 2.2 client


Følgende video-serie demonstrere hvordan der kan genereres en restfull webservice der giver adgang til HotelDB.

Screencast: WebServiceEntityFrameworkDemo1 (Part1)

Note:
I videoen anvendes VS2013. Bortset fra layout er det samme fremgangs måde som med VS2019. Dog skal der benyttes ASP.Net Web App (.Net Framework) og ikke (.Net Core) (se video - 0:57). Bemærk HTTPS skal ikke være markeret (valgt)!

Samt hvordan man kan tilgå denne Webservice fra en client application (console)
Screencast: WebServiceEntityFrameworkDemo2 (Part2)

Note:
I videoen (1:33) benyttes en NuGet-pakke: Microsoft ASP.NET Web API 2.2 Client lib. Du skal anvende NuGet-pakken: Microsoft.Asp.Net.WebApi.Client (v.5.2.7) samt NewtonSoft.Json (v 6.0.4) i stedet.


Demonstrates how to create a database view and how to provide the view by using a webservice controller.
Screencast: WebServiceView (Part3)

HotelDB:
SQLCreate0913.sql
SQLInsert0913.sql

Kort vejledning i oprettelse af HotelDB via ovenstående script: Vejledning


Exercise O17:

Webservice - rest
In this exercise you have to create a restfull webservice to the HotelDB, then fetch
the data from the HotelDB by using the service - and print the result in the console.

Start creating a new Console project (HotelWebserviceRest) and follow
the steps I demonstrate in the screencast.

Notice:
When using the DbContext API for Code First you have to add:
base.Configuration.ProxyCreationEnabled = false in the DbContext-class

public class MyClass : DbContext
{
public MyClass(){base.Configuration.ProxyCreationEnabled = false;} }
see: https://stackoverflow.com/questions/3372895/datacontractserializer

Hint to the client-site:

const string ServerUrl = "http://localhost:50000";

HttpClientHandler handler = new HttpClientHandler();
handler.UseDefaultCredentials = true;

using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(ServerUrl);
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
try
{

var response = client.GetAsync("api/Hotels").Result;

if (response.IsSuccessStatusCode)
{
IEnumerable<Hotel> hotelData = response.Content.ReadAsAsync<IEnumerable<Hotel>>().Result;
foreach (var hotel in hotelData)
{
Console.WriteLine(hotel);
}

}


Notice:
When using Web API Client library (HttpClient) it can be nessesary to change the DefaultCredentials

HttpClientHandler handler = new HttpClientHandler();  
handler.UseDefaultCredentials = true;  
HttpClient client = new HttpClient(handler);
see: http://social.msdn.microsoft.com/forums/windowsapps

 

C#-Projects:
WebserviceTest.zip (Code demonstrated in the class)

 

Fredag d. 27/3 - kl 9.15
Dagens Program:

  • Jeg går på kl. 9.15 og starter med at give en kort status opdatering.
  • Så følger en repetition/gennemgang af vores webservice arkitektur
  • Dernæst er der opgaveløsning

Jeg vil gerne holde et møde med alle grupper i dag efter tur. Hvert møde forventes at vare ca 20 min og jeg starter med Gr1 ca kl. 10.00

Plan:
Gr1: 10.00
Gr2: 10.20
Gr3: 10.40
Gr4: 11.10
Gr5: 12.10
Gr6: 12.30
Gr7: 13.00

    Denne illustration giver et overblik over arkitekturen bag vores Webservice:
Webservice-Overview.docx

Exercise O18: (Windows Store App - Event)

Tag udgangspunkt i EventMaker fra uge 5.

  • Lav en Database EventDB med en tabel Event, - tabellen skal have samme attributter (navn/type) som properties fra class Event i EventMaker.
  • Tilføj et nyt ASP.net - projekt (EventWS) til EventMaker solution og generer Context og Controller til projektet, så databasen kan tilgås via webservice.
    (Husk: No-authentication og base.Configuration.ProxyCreationEnabled = false;)
  • Test i Browser at WS virker.
  • Opret et Consolprojekt og test, at der kan tilgås fra klient-side
    (Husk: Nuget: Web API client Lib 2.2).
  • Ændre i EventMakers PersistensService så der benyttes en Database i stedet for at seriealisere til filer - der skal tilføjes en ny metode til PersistencyService: DeleteEventAsync som kaldes fra EventSingleton i stedet for SaveEventsAsJsonAsync (før blev filen overskrevet, nu skal der bare slettes en event fra DB). Ellers er det kun PersistencyService der skal opdateres (LoadEventsAsJsonAsync og SaveEventsAsJsonAsync) da vi benytter lagdelt arkitektur (og følger retningslinierne fra Larmann :)).

C#-Projects:
EventMaker.zip (version 2, med EventDB)

Tirsdag d. 31/3 - kl 9.15
Dagens Program:

  • Jeg går på kl. 9.15 og starter med at give en kort status opdatering.
  • Dernæst er der opgaveløsning

Bemærk:
Start med at få lavet jeres Hotel-opgave, dvs få lavet et UWP-projekt der benytter MVVM og som anvender jeres HotelWS til at vise Hotellerne i et simplet ListView (Keep it simple, dvs ikke noget med singleton og RelayCommands osv. Kun et View med et listView en ViewModel med et ObservableCollection<Hotel>. Husk I kan IKKE lave en reference fra UWP til jeres webservice (lav en ny klasse Hotel og copy paste - det er meget vigtigt at alle navne er identiske i begge klasser - ellers virker json konverteringerne ikke). Lav en Persistency klasse der benytter HttpClient til at hente Hotellerne og indsætter disse i jeres OC.

Dernæst kan i gå i gang med EventMaker-opgaven

Jeg holder møder med alle grupper efter tur. De første møder forventes at vare ca 20 min og jeg starter med Gr 6 ca kl. 10.00

Foreløbig plan:
Gr6: 10.00
Gr7: 10.20
Gr1: 10.40
Gr2: ?
Gr3: ?
Gr4: ?
Gr5: ?

14
Web API 2 (Cont.)

Advanced Stuff:
In ASP.NET Web API, a controller is a class that handles HTTP requests. The public methods of the controller are called action methods or simply actions. When the Web API framework receives a request, it routes the request to an action. For more information read:
Routing in ASP.NET Web API
Routing and Action Selection
Create a REST API with Attribute Routing in Web API 2

Web API: Mixing Traditional & Verb-Based Routing ***
MVC web API with more then one Get method



(It's about - Rest isn't just CRUD actions, and how to invoke the non-CRUD actions)

Other interresting links:
RESTful HTTP in practice




Exercise O19: (Windows Store App - Hotel)

Make a front-end (windows store app) to your Hotel webservice, so you can do the CRUD and non-CRUD operations on the HotelDB (eg. display hotel/room information, create new guest and bookings, display current bookings on a selected hotel ....).

Use ICommand/RelayCommand - not code-behind event-handling. (look at the new EventTriggerBehavior/InvokeCommandAction)

Use GridView/ListView (ItemSource, ItemTemplate) and DataTemplates

Notice:
If you have used "Windows Authentification" to your back-end Webservice - you will get an 401 error when trying to get access from win 10 store app. Create a new web-service with "No Authentification" (or find out - how to change by configuration?)

For saving an object in the DB, you must use PostAsync( ) and convert the c#-object to a Json-object:

string postBody = JsonConvert.SerializeObject(hotel);
var response = client.PostAsync("api/Hotels",new StringContent(postBody, Encoding.UTF8, "application/json")).Result;

But you have to install the NuGet Package: Json.Net first.

OR use PostAsJsonAsync see: Calling a Web API From a .NET Client in ASP.NET Web API 2 (C#)

If You want to insert a new hotel:

1) In the DB - change the primary key to be auto generated (set column Hotel_No to identity)
2) In class Hotel - change the Annotation for Hotel_No to:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Hotel_No { get; set; }



C#-Projects:

WSRestHotels.zip (code demonstrated in class)
HotelDbtest2.mdf (zip-fil)

 

Fredag d. 2/4 - kl 9.15
Dagens Program:

  • Jeg går på kl. 9.15 og starter med at give en kort status opdatering.
  • Dernæst er der opgaveløsning

Der arbejdes videre med EventMaker og Hotel opgaven. Jeg besøger jer (grupperne) på skift. Får i brug for min hjælp (uden for tur) så skriv i chatten så kommer jeg ASAP.

15 Påskeferie    

Tirsdag d. 14/4 - kl 9.15
Dagens Program:

  • Jeg går på kl. 9.15 og starter med at give en kort status opdatering.
  • Kodedokumentation (med Doxygen)
  • Opgaveløsning

Først skal i "lege" lidt med kodedokumentation, find et lille projekt i har lavet og prøv at kommentere det. Prøv at generere XML-dokument og prøv at benytte Doxygen til at generere et HTML-dokument som dokumentation til projektet.

Derefter arbejdes der videre med EventMaker og Hotel opgaven. Jeg besøger jer (grupperne) på skift.
Får i brug for min hjælp (uden for tur) så skriv i chatten så kommer jeg ASAP.

16.1 Dokumentation Code Documentation with Doxygen


Exercise O21:




Fredag d. 17/4 - kl 9.15
Dagens Program:

  • Jeg går på kl. 9.15 og starter med at give en kort status opdatering.
  • Task, Thread og Asynchron programmering
  • Opgaveløsning

Først skal i arbejde lidt med opgaverne O22 og O23 i grupperne.

Derefter arbejdes der videre med EventMaker og Hotel opgaven som sidst. Hvis i ikke allerede har prøvet det så vil jeg foreslå:
At i laver et Database View (Create View .. as Select ...) samt et nyt DBContext og controller til dette view og tester det.
Prøver at lave jeres egen controller der opretter et objekt af HotelDBContext og benytter LINQ til at udtrække informationer fra diverse DbSet.
Find selv på spændende emner i gerne vil teste inden projektet starter (eller spørg mig hvis i mangler ideer)

Jeg besøger jer (grupperne) på skift.
Får i brug for min hjælp (uden for tur) så skriv i chatten så kommer jeg ASAP.

16.2
Task, Thread, Asynchron

Microsoft:

Task-based Asynchronous Programming
Asynchronous programming


CodeProject: Asynchronous Programming in C# 5.0 using async and await

Async/Await - Best Practices in Asynchronous Programming

Slides: ProcessesAndThreads (PowerPoint)
Slides: AsynchronousProgramming (PowerPoint)

 


Joseph Albahari Threading in C#, part 1
Threads in C# (slides)

Example: TryThread | WriteToArray

 

Ekstra:
Joseph Albahari Threading in C#, part 2

Synchronization: Threads + monitors (slides)

Example: ThreadBank



C#-Projects:
WSRestHotels.zip (ver. 2 - HotelApp/HotelWS)
WSRestHotels.zip (ver. 3 - HotelApp/HotelWS)


C#-Projects:
GuiExampleAsyncAwait


Notice:

"Blend always launches with "We're preparing for first use" dialog"



Exercise
O22:
First thread | Solution
O23: Adding threads to an existing program | Solution

Ekstra:
O24:
Producer-Consumer | solution

Fredag d. 2/4 - kl 9.15
Dagens Program:

  • Jakob og Jeg går på kl. 9.15 og starter med at give en kort status opdatering.
  • Dernæst er der introduktion til projektet

Derefter er der gruppearbejde, jeg besøger jer på skift.

17-22 Projektarbejde Projektaflevering: Wiseflow d. 27. maj kl. 11.00
Præsentation (Demodag): d. 29. maj kl. 10.30- ca 12.00 (Afholdes på Teams i kanalen General)
Eksempler på tidligere opgaver:
GameMasterTools.pdf
Flygo og DriversApp (zip)
23-24 Eksamenslæsning Repetition/Spørgetimer:
25 Eksamen 22-24 juni 2019 Eksamensliste
Pensumsliste