Programiranje

C# - Problemi i rješenja

Pero Dinamit sri 8.12.2021 13:28

Imam klasu koju popunjavam neki testnim podacima koji se ponavljaju.

 

class GetDoc

{

public Document docum1 = new Document
{
Title = "title 1",
Content = new List<IContent> {

new Section
{
Title = "title",
Size = ContentSize.Large,
Content = new List<IContent>
{
new HeaderValue
{
Header = "header",
Value = "yes",
Size = ContentSize.Large,
Orientation = Orientation.Horizontal,
IsDoubleSpace = false
},
new HeaderValue
{
Header = "header",
Value = "no",
Size = ContentSize.Large,
Orientation = Orientation.Horizontal,
IsDoubleSpace = false
},
new HeaderValue
{
Header = "header",
Value = "1111",
Size = ContentSize.Large,
Orientation = Orientation.Horizontal,
IsDoubleSpace = false
}
}
}
}
}

}

Ovaj boldani dio (Section) sa istim vrijednostima mi se kasnije ponavlja na nekoliko mjesta sa istim podacima.

Kako to mogu izbjeći?

 

sry na formatiranju, ne znam zašto tako napravi...

andrijam pet 10.12.2021 15:04

To ti je lagano,samo izvučeš tu klasu, nešto ovako

 

class GetDoc

{

public Document docum1 = new Document
{
Title = "title 1",
Content = new List<IContent> {


}

 

document = mynewClass.Section
}
}

 

class myNewClass{

public static Section =>  new Section
{
Title = "title",
Size = ContentSize.Large,
Content = new List<IContent>
{
new HeaderValue
{
Header = "header",
Value = "yes",
Size = ContentSize.Large,
Orientation = Orientation.Horizontal,
IsDoubleSpace = false
},
new HeaderValue
{
Header = "header",
Value = "no",
Size = ContentSize.Large,
Orientation = Orientation.Horizontal,
IsDoubleSpace = false
},
new HeaderValue
{
Header = "header",
Value = "1111",
Size = ContentSize.Large,
Orientation = Orientation.Horizontal,
IsDoubleSpace = false
}
}

 

}

 

 

 

}

Dino-san sri 11.5.2022 13:11

Pozdrav,

 

dobio sam jedan zadatak koji se odnosi na postavljanje testova u Visual studio 2019 nad već djelomično dobivenom programskom logikom. Trebam nadopisati još nekoliko programskih dijelova kako bi aplikacija uspješno radila.

 

Problem se pojavljuje u prikazanoj slici koja treba imati navedene klase.

Zanima me što bi sada značio ovaj dio povezanog entiteta prikazan na slici ?

 

Entitet:

 

Upravitelj Transakcijama

+ Upravitelj Transakcijama()
+ PrebaciSredstva(izvorIBAN: string, odredisteIBAN: string, iznos: double) : Transakcija [?] + OdobriMinus(izvorIBAN: string, odobreniMinus: double) : void

 

Hvala.

R4zOR229 pet 13.5.2022 10:44
Dino-san kaže...

A što znači Transakcija [?] s upitnikom unutar uglatih zagrada ?

 

Provodi se nasljeđivanje bez ikakvih parametara unutar  [?]. Jesam li u pravu ?

 Po meni ta metoda ovak nekak izgleda

 

public Transakcija[] PrebaciSredstva(string izvorIBAN, string odredisteIBAN, double iznos)

 

ovaj upitnik bi mozda bio velicina polja, sam se to bas i ne koristi neg koristis listu da nebi moral znat velicinu. Kolko ja vidim ti nije nikakvo nasljevidanje nego return type metode, jedino je napisano na mutav nacin pa po sintaksi izgleda slicno inheretancu u c#

andrijam pon 16.5.2022 12:58

Ne nisi, česta prasksa za prikaz potpisa funkcije u pseudo kodu je npr. imeFunkcije(int par1, int par2): returnType.

Ovo Transakcija[?] ne znam što znaći, možda je trebalo biti Transakcija?[], ili neodređena duljina arraya ili znaći bilo kola vrta liste. npr Transakcija[], IList<Transakcija>, IEnumerable<Transakcija> , ili samo jedan transakcija ako je operacija izvršena ako nije vrača se null

arnep pet 3.6.2022 10:24

Pozdrav!

 

Pokušavam shvatiti način na koji funkcionira Dependency Injection u .NET Core.

Dakle, imam jedan ASP.NET Core WebAPI projekt i imam Class Library projekt. CL projekt mi predstavlja DataAccess Layer gdje mi se nalazi EntityFrameworkCore veza s postojećom bazom podataka.

Također imam sučelje i klasu koja implementira to sučelje (IUserRepository, UserRepository).

 

Kod u Program.cs datoteci mi izgleda ovako:

builder.Services.AddDbContext<SocialNetworkContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("Database")));
builder.Services.AddScoped<IUserRepository, UserRepository>();

 

I sad, ja koristim taj context u UserRepository klasi:

private readonly SocialNetworkContext _socialNetworkContext;

public UserRepository(SocialNetworkContext context)
{
   _socialNetworkContext = context;
}

 

Nakon toga UserRepository klasu koristim u pripadajućem kontroleru:

private IUserRepository _userRepository;
public UsersController(IUserRepository userRepository)
{
  this._userRepository = userRepository;
}

 

I API funkcionira. Kako je to moguće?

Nisam nigdje instancirao ni DbContext klasu, niti UserRepository klasu. Nemam nigdje definiranu vezu između DbContext i UserRepository klasa, nisam nigdje injectao DbContext objekt u UserRepository klasu, no program i dalje funkcionira kao da objekt postoji.

Ne shvaćam baš ovaj koncept, proguglao sam već par objašnjenja za Dependency Injection no dosta mi je šturo objašnjeno.

tnakir pet 3.6.2022 11:52

Pa definirao si u Program.cs da se injecta taj tvoj repository u svaki kontroler koji u konstruktoru ima taj tip klase kao parametar.

 

.net core ti sam instancira kontroler sa repozitorijem (ili logerom, business logic layer handlerom ili nečim šestim, ovisno što ti treba u tom kontroleru). Tako funkcionira DI u .net coreu.

 

Sad opet ovisi koji tip DI koristiš hoće li se tvoj repozitorij kreirati pri svakom requestu, pri svakoj konekciji ili samo prvi put kad je napravljen request: Tranzitni, Scoped ili Singleton

arnep pet 3.6.2022 13:14
tnakir kaže...

Pa definirao si u Program.cs da se injecta taj tvoj repository u svaki kontroler koji u konstruktoru ima taj tip klase kao parametar.

 

.net core ti sam instancira kontroler sa repozitorijem (ili logerom, business logic layer handlerom ili nečim šestim, ovisno što ti treba u tom kontroleru). Tako funkcionira DI u .net coreu.

 

Sad opet ovisi koji tip DI koristiš hoće li se tvoj repozitorij kreirati pri svakom requestu, pri svakoj konekciji ili samo prvi put kad je napravljen request: Tranzitni, Scoped ili Singleton

 Znači isto tako je ova linija koda zaslužna da se DbContext injecta u svaku klasu koja ga koristi?

builder.Services.AddDbContext<SocialNetworkContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("Database")));

 

Hvala na objašnjenju!

tnakir pet 3.6.2022 14:00
arnep kaže...
tnakir kaže...

Pa definirao si u Program.cs da se injecta taj tvoj repository u svaki kontroler koji u konstruktoru ima taj tip klase kao parametar.

 

.net core ti sam instancira kontroler sa repozitorijem (ili logerom, business logic layer handlerom ili nečim šestim, ovisno što ti treba u tom kontroleru). Tako funkcionira DI u .net coreu.

 

Sad opet ovisi koji tip DI koristiš hoće li se tvoj repozitorij kreirati pri svakom requestu, pri svakoj konekciji ili samo prvi put kad je napravljen request: Tranzitni, Scoped ili Singleton

 Znači isto tako je ova linija koda zaslužna da se DbContext injecta u svaku klasu koja ga koristi?

builder.Services.AddDbContext<SocialNetworkContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("Database")));

 

Hvala na objašnjenju!

Zapravo ti ta linija instancira sam DbContext i definira na koji će se DBMS spajati (SQL, mySQL, SQLite etc...) i kroz koji connString će se spajati na bazu (npr ovde možeš definirati da ti se u dev environmentu spaja na testnu bazu, a u produkcijskom na produkcijsku bazu).

 

DbContextu bi trebao pristupati isključivo kroz Repository. DI bi ti trebao instancirati repozitorij u svakom kontroleru koji ga ima u konstruktoru. 

arnep pet 3.6.2022 15:05
tnakir kaže...

Zapravo ti ta linija instancira sam DbContext i definira na koji će se DBMS spajati (SQL, mySQL, SQLite etc...) i kroz koji connString će se spajati na bazu (npr ovde možeš definirati da ti se u dev environmentu spaja na testnu bazu, a u produkcijskom na produkcijsku bazu).

 

DbContextu bi trebao pristupati isključivo kroz Repository. DI bi ti trebao instancirati repozitorij u svakom kontroleru koji ga ima u konstruktoru. 

 

Ne znači li to veliki udarac na performanse aplikacije?

Nas su na faksu učili da DbContext objekti uzimaju puno memorije pa je bolja opcija korisitit ih uz using blokove čime context objekt postoji samo unutar tog bloka koda. Sad vidim da se u praksi koriste uz DI pa mi je malo čudno.

Nuclear_Phoenix pet 3.6.2022 15:56

DbContext je optimiziran da se brzo instancira, odradi što je potrebno (jedan unit of work, dakle jedan query ili jedan blok transakcija) i bude disposed. Ima neki sitni overhead kod instanciranja ali te profesore nitko nije obavijestio da je 1998. godina bila prije 25 godina i da server ima malo više od 128MB RAM.

arnep pet 3.6.2022 16:38
Nuclear_Phoenix kaže...

DbContext je optimiziran da se brzo instancira, odradi što je potrebno (jedan unit of work, dakle jedan query ili jedan blok transakcija) i bude disposed. Ima neki sitni overhead kod instanciranja ali te profesore nitko nije obavijestio da je 1998. godina bila prije 25 godina i da server ima malo više od 128MB RAM.

 Jasno. Hvala na objašnjenju!