Laden...

Forenbeiträge von JimStark Ingesamt 309 Beiträge

24.03.2020 - 15:21 Uhr
...  
  
namespace Firmenname.Produkt.Services  
{  
    public class CustomerService  
    {  
        private readonly IDbContext _dbContext;  
  
        public CustomerService(IDbContext dbContect)  
        {  
            _dbContext = dbContect;  
        }  
        public async Task<IList<CustomerWithOrdersProjection>> GetCustomersWithOrders(int id)  
        {  
            // hier die logik um die Customers mit Ordern zu laden  
  
            var customerEntities = await _dbContext.Customers.Include(c => c.Orders).Where()...ToListAsync() //   
  
            IList<CustomerWithOrdersProjection> customers = new List<CustomerWithOrdersProjection>()  
                // Schleife und hier die Werte der Einträge in customerEntities in customers übertragen  
                // Automapper kann dies auch automatisch machen  
  
            return customers;  
        }  
    }  
  

Initalisiere ich den Service dann in der ASP.NET Anwendung?

Da registriert man ja eigentlich einen Kontext z.B. so:

    services.AddDbContext<SchoolContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

Also von wo aus würdest du deinen CustomerService erstellen?

Ich habe jetzt einmal das als Test.Common.Data:



    public class OrderContext : DbContext
    {
        public OrderContext(DbContextOptions<OrderContext> options) : base(options)
        {
        }

        public DbSet<Customer> Customers { get; set; }
        public DbSet<Orders> Orders { get; set; }
}

Nun erstelle ich eine ähnliche Service Funktion wie deine (mit GetAllOrders(), etc.), von wo initialisiere ich die jetzt?

17.03.2020 - 18:44 Uhr

Ich würde davon abraten und lieber 100€ für nen VPN Server ausgeben

Und wieso? Ist VPN sicherer als ein SSH Tunnel?

17.03.2020 - 15:16 Uhr

Hi,

ich hoffe das Thema passt hier, hat ja nichts mit C# zu tun (Ansonsten bitte verschieben).

Angenommen eine kleine Firma hat 2 Desktop-PCs im Haus und möchte darauf jetzt von zuhause zugreifen.
Wäre es sicher einen Ubuntu Server aufzustellen und 2 SSH Tunnel mit Zertifikat-Authentifizierung einzurichten, diese zeigen dann jeweils auf die RDP-Ports der PCs. Zum Schluss werden die 2 Tunnel-Ports im Router nach außen freigeben. Auf die sollte man sich dann ja von außen verbinden können.
Wäre das eine einfache Alternative zu einem VPN Server oder ist davon abzuraten?

Danke!

12.03.2020 - 20:00 Uhr

Ok danke, nochmal zu den Schichten:

Test.Objects.dll - Objekte/Models mit denen gearbeitet wird
Test.Data.dll - Stellt den DbContext zur Verfügung
Test.Controller.dll - Stellt die Views,... zur Verfügung
Test.Host.dll - das eigentliche ASP.NET Projekt holt sich nur noch Views, etc. aus unteren Schichten

Wäre es so "nach Stand der Technik" richtig ein größeres Projekt zu strukturieren? Gibt es dazu irgendwo gute praktische Beispiele?

12.03.2020 - 15:31 Uhr

Nochmal kurz was zum Verständnis dazu:

Selbst wenn ich das in Schichten trenne löst das ja nicht mein Problem.
Ich greife ja dann nur auf den DbContext über eine DLL zu.

Also ist die eigentliche Lösung für das Problem:

Include(c => c.Orders)

Oder?

10.03.2020 - 20:19 Uhr

Super okay! Der Post drüber bezog sich auf die Antwort von Papst

Mit was arbeite ich dann in der Bibliothek am besten? Entity Framework?

10.03.2020 - 20:17 Uhr

Meinst du jetzt ich solle den Datenzugriff komplett vom ASP.NET Projekt auslagern? Also es z.B. in eine DLL in der Projektmappe aussourcen?
Und von der dann aus mit nem ORM Mapper auf die DB zugreifen?

Oder meinst du die Modell, Controller, View innerhalb von ASP?

10.03.2020 - 20:00 Uhr

Danke für die Antworten!

Der empfohlene Weg sind Projektionen: die Business-Schicht ist dabei in der Verantwortung.
Tools wie AutoMapper unterstützen dabei die Query-Erzeugung mit Hilfe von Expressions.

>

Wie aber Papst schon sagte musst Du ordentlich die Schichten trennen.

Du meinst jetzt dass ich im Controller, beim Aufruf von Order Details z.B. ein ViewBag übergebe mit dem Customer der Order oder?



public List<Order> Orders { get; set; }


Also das dann weglassen und nur Customer.Where(p=>p.Id==CustomerId).First() im Controller übergeben?

10.03.2020 - 17:12 Uhr

Hi, folgender Code:


    public class Order
    {
        public int Id { get; set; }
        public string Title { get; set; }

        public Customer Customer { get; set; }
    }

    public class Customer
    {
        public int Id { get; set; }
        public string Name_Last { get; set; }
        public string Name_First { get; set; }
        public List<Order> Orders { get; set; }

        [Display(Name = "Full Name")]
        public string FullName
        {
            get
            {
                return Name_Last + ", " + Name_First;
            }
        }
    }

Die Objekte haben ich in einem DbContext. Am Start lege ich mir mit einer Seed-Klasse ein paar Beispiel Daten an und verknüpfe dort die Objekte bereits mit order1.Customer = customer1 usw.
Das geht soweit und mir wird in der Datenübersicht der Tabelle das auch angezeigt (also der Fremdkey).

Wenn ich jetzt aber in den Views (Order-Details) den Customer anzeigen lassen will, erscheint gar nichts.


        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Customer.FullName)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Customer.FullName)
        </dd>

Der DisplayName wird angezeigt aber kein Inhalt.
Kann mir jemand helfen? Danke!