Laden...
M
MorphieX myCSharp.de - Member
Softwareentwickler Rahden Dabei seit 06.02.2012 184 Beiträge
Benutzerbeschreibung

Forenbeiträge von MorphieX Ingesamt 184 Beiträge

30.09.2019 - 07:35 Uhr

Ich wundere mich gerade, dass noch gar nicht der Einwand kam, dass Datenbank Entitäten nicht an die UI gebunden werden, sondern dafür ViewModels benutzt werden sollten. 🤔

08.05.2019 - 11:57 Uhr

Du schreibst die Werte ja direkt in deinen SQL-CommandText.
Du musst dafür aber Parameter benutzen, die du statt der Werte in den CommandText schreibst - und anschließend entsprechend im Code füllst.

Dazu gibt es unzählige Tutorials, bitte einfach mal danach googeln.

06.05.2019 - 07:19 Uhr

Vielen Dank für eure Antworten 😃

Die Liste mit Alternativen kannte ich noch nicht - hier scheint mir LibUA, welche unter Apache 2.0 lizensiert ist, recht interessant.
Ich werde die Lib mal ausprobieren 😃

03.05.2019 - 13:08 Uhr

Hallo zusammen,

kurz zu unserem Vorhaben:
Ich möchte meine Software (.NET Core 2.2) erweitern, um Maschinendaten über OPC UA zu monitoren.

Die Software ist in einzelne Plugins (als eigene Assemblies) aufgeteilt und ist soweit closed source.
Nun möchte ich das NuGet Paket "OPCFoundation.NetStandard.Opc.Ua" verwenden um die OPC-UA-Kommunikation zu realisieren.
Dieses Paket steht allerdings unter der GPLv2. (und als 2. Möglichkeit unter einer anderen Lizenz für Jährlich knapp 4.800$)

Ich weiß, hier kann ich keine Rechtsberatung erwarten, aber vielleicht hat ja jemand schon Erfahrungen mit meinem Problem.

Darf ich ein Plugin (eigene PCL) dafür erstellen, welches ich dann unter der GPLv2 lizensiere und in meiner Hauptanwendung zur Laufzeit lade? Kann ich meine Hauptanwendung dann weiterhin unter einer anderen Lizenz vertreiben?
Falls das funktioniert, muss ich dann beim Laden des Plugins irgendwelche Klimmzüge machen, damit ich rechtskonform bin?

Alternativ wäre ich natürlich auch an einer anderen Möglichkeit zur OPC-UA-Kommunikation interessiert. Also quasi ein anderes SDK...? Ich weiß dass es da welche im kommerziellen Bereich gibt, z.B. von Softing. Ich suche aber - wie so oft - eine möglichst günstige Möglichkeit.

05.04.2019 - 07:05 Uhr

Yes! 😃

Genau das war es, vielen Dank!

Btw. eine Reparatur von VS hat nichts gebracht.

04.04.2019 - 16:42 Uhr

Es kam keine Info zum Neustart - habe ich aber trotzdem gemacht 😉 Kann ich also ausschließen
Und ich wüsste auch nicht dass ich irgendwann mal Previews installiert habe. Das System ist noch relativ frisch 😕
Naja, ich repariere gerade die VS-Installation, möglicherweise haben irgendwelche Erweiterungen da reingepfuscht.

04.04.2019 - 15:48 Uhr

So wie ich dich verstehe, möchtest du nicht den Quellcode der Seite haben, sondern das DOM der Seite zu einem festgelegten Zeitpunkt (z.B. nachdem die Seite komplett gerendert wurde)

Dazu brauchst du irgendeine Renderengine (Webkit, Trident,...)
Das könntest du z.B. über das WebBrowser-Control realisieren.

04.04.2019 - 14:57 Uhr

Hallo,

ich versuche gerade eine neue .net core 2.2 Anwendungen (ASP.NET Core MVC) zu erstellen und habe mir dazu das .NET Core SDK 2.2.202 x64 heruntergeladen und mein VS 2017 aktualisiert (Version 15.9.11)

Wenn ich nun unter "Datei > Neu > Projekt... > .NET Core" die "ASP.NET Core Webanwendung" auswähle, kann ich im nächsten Dialog oben ".NET Core" und "ASP.NET Core 2.2" auswählen.

Wenn ich das Projekt dann anlege, bekomme ich folgende Fehlermeldung:
Das aktuelle .NET SDK unterstützt .NET Core 2.2 nicht als Ziel. Geben Sie entweder .NET Core 2.1 oder niedriger als Ziel an, oder verwenden Sie eine .NET SDK-Version, die .NET Core 2.2 unterstützt.

In den Projekteigenschaften ist der Eintrag unter Zeilframework nun leer. Ich kann hier nur .NET Core 1.0 - .NET Core 2.1 auswählen. NET Core 2.2 fehlt hier also.

Folgende Info bekomme ich via dotnet --info:

PM> dotnet --info
.NET Core SDK (gemäß "global.json"):
 Version:   2.2.202
 Commit:    8a7ff6789d

Laufzeitumgebung:
 OS Name:     Windows
 OS Version:  10.0.14393
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\2.2.202\

Host (useful for support):
  Version: 2.2.3
  Commit:  6b8ad509b6

.NET Core SDKs installed:
  2.1.201 [C:\Program Files\dotnet\sdk]
  2.1.202 [C:\Program Files\dotnet\sdk]
  2.1.302 [C:\Program Files\dotnet\sdk]
  2.1.403 [C:\Program Files\dotnet\sdk]
  2.1.503 [C:\Program Files\dotnet\sdk]
  2.1.505 [C:\Program Files\dotnet\sdk]
  2.2.202 [C:\Program Files\dotnet\sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.All 2.1.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.5 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.7 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.2.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.1.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.5 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.7 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.2.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 2.0.7 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.5 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.7 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.2.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download

Hat jemand eine Idee was das schon wieder ist?

22.03.2019 - 13:01 Uhr

Was ist das denn für ein WebClient?
Gibt es dazu irgendwelche Rahmenbedingungen? (z.B. läuft der nur im Intranet, z.B. nur im Internet Explorer?)

auf jeden Fall müsstest du entweder Outlook direkt ansteuern (Interop) oder über MAPI gehen. Beides ist ohne weiteres nicht direkt aus einer Website möglich - da gibt es aber mehrere Möglichkeiten das zu realisieren, z.B. ActiveX, XBAP, Silverlight (?)

Edit: Oder, falls es die Situation erlaubt, ein Browserplugin entwickeln welches sich der User erst installieren muss, damit der Browser mit Outlook kommunizieren kann.

14.03.2019 - 10:29 Uhr

Post mal bitte ein Beispiel-HTML Markup.
Laut deiner Beschreibung ist das kein valides HTML.

23.11.2018 - 11:42 Uhr

Ok, danke für die Info.
MSDN habe ich leider nicht.

Dann käme ich mit einem eigenen VServer bei anderen Anbietern wohl günstiger davon.

23.11.2018 - 11:10 Uhr

Hallo zusammen,

für ein privates Projekt möchte ich gerne eine ASP.NET-Webanwendung im Internet hosten.
Welche Hosting-Strategie könnte ich dabei fahren, um die Anwendung möglichst kostengünstig ins Web zu stellen?
Ich verdiene damit keinen Cent, daher wäre kostenlos natürlich am besten. 😃

Meine Voraussetzungen:

  • ASP.NET (MVC) (Ich verwende abhängige Assemblies (API) von einem Computerspiel, die mir die Verwendung von ASP.NET Core (noch) nicht ermöglichen)
  • HTTPS / SSL - ist meiner Meinung nach heutzutage Pflicht, wenn man sensible Daten verarbeitet (Logins z.B.)
  • MS SQL Server (Datenbankgröße entspricht vielleicht ein paar MB)
  • Eigene Domain (bereits vorhanden)

Bzgl. der Bandbreite und des Datenvolumens kann ich noch nichts sagen, denke aber dass mir 5 GB / Monat ausreichen würden.

Würde ich mit diesen Anforderungen bei Azure kostenlos hosten können?
Speziell beim Thema Domain / SSL bin ich mir bei Azure unsicher.

Hat sonst jemand Erfahrungen mit anderen Anbietern?

15.11.2018 - 15:49 Uhr

Und die AGB sagen aus, dass der Token nicht veröffentlicht werden darf.
Deine Kunden müssen das dann sauber Serverseitig umsetzen - notfalls durch eine eigene Proxy-API.
Im Idealfall bietest du denen ein SDK an.

Oder was spricht dagegen?

09.11.2018 - 07:34 Uhr

Wenn es etwas kosten darf, dann gibt es auch eine gute Lösung von VMWare:
https://www.vmware.com/de/products/mirage.html

Dort kannst du neben einem Windows-Images auch Software-Images und Treiber pro Computermodell verteilen.
Es geht sogar noch weiter und kann die Software als eigene Schicht verteilen und somit das Update-Management dadurch zentralisieren.

Wenn es dir aber nur darum geht ein Golden-Image zu verteilen und die Computer automatisiert in eine Domäne zu bringen, geht das damit natürlich auch.

Allerdings gibt es mit Sicherheit kostengünstigere Lösungen, wenn man das komplette Featureset nicht benötigt.

09.10.2018 - 14:18 Uhr

Eine Anmerkung noch: wenn ihr nur diskutiert, ob Komponententests sinnvoll sind, weil es euch um die Zertifizierung geht...in so einer Softwarebude würde ich nicht arbeiten wollen.

Ich auch nicht. 😉 Das hat damit auch nichts zutun.
Die Frage war, ob Unit-Tests für ISO9001 erforderlich sind -> Antwort: Nein
Oder ob Unit-Tests für ISO9001 hilfreich sind -> Antwort: vielleicht, wenn man will, richtig?

Unabhängig von ISO 9001 sind Komponententests - wenn es nicht gerade irgendwelche kleinen Tools sind - für mich generell sinnvoll. Es ging mir nur darum in wie weit wir diese bei der ISO 9001-Zertifizierung berücksichtigen müssen / wollen.

Danke für den Hinweis zu IEC 25000, werde ich mir durchlesen 😃

09.10.2018 - 13:54 Uhr

Ja, ein Teil (Tochterunternehmen) des Unternehmens ist bereits nach ISO 9001 zertifiziert.
Der Bereich Softwareentwicklung allerdings noch nicht - ich dachte Unit-Tests wären ein Mittel um die Qualität von Software zu gewährleisten. Und da das Kerngeschäft Software ist, gehört das für mich auch zur grundsätzlichen Organisation dazu.

Gibt es einen üblicheren Standard in der Softwareentwicklung, den man eher erfüllen möchte?

09.10.2018 - 13:01 Uhr

Hallo zusammen,

es geht hier nicht um die Frage ob und wann es sinnvoll ist, Komponententests einzusetzen, sondern ob diese bei der Zertifizierung nach ISO 9001 erforderlich oder zumindest hilfreich sind.

Hat da jemand Erfahrungen?
Mich würden eure Meinungen und Erfahrungen dazu interessieren. Wenn gewünscht, kann das Thema auch in den Off-Topic-Bereich verschoben werden.

22.08.2018 - 22:46 Uhr

Ist leider eine Anwendung die später an ganz unterschiedliche Kunden mit unterschiedlichen Umgebungen verkauft werden soll.
Aber ich schaue mir das auf jeden Fall noch mal an, danke 😃

22.08.2018 - 13:57 Uhr

So, ich komme langsam zu dem Ergebnis, dass es gar nicht (so einfach) möglich ist.

NTLM über einen LDAP-Client ist nicht möglich, da man (zumindest beim Active Directory) keine Möglichkeit hat auf das gehashte Passwort des Benutzers zuzugreifen.
Windows selbst löst das wohl über die Secur32.dll, die es aber natürlich nur unter Windows gibt. Da hat man - wenn man plattformabhängig bleiben will - also keine Möglichkeit diese zu nutzen. Außer man implementiert die Funktionalität der Secur32.dll per reverse engineering selbst - nein, lieber nicht 😉

Möglicherweise brauche ich eine eigene Anwendung, die sich nur um das SSO kümmert und unter Windows gehostet werden muss. Hat da jemand Erfahrungen?

22.08.2018 - 07:33 Uhr

Hi,

ich sitze gerade an einem ASP.NET Core 2.1-Projekt mit eigener (Cookie-)Authentifizierung.
Die Authentifizierung sieht so aus, dass die Zugangsdaten

  • entweder komplett in der Anwendung verwaltet werden können (Benutzername + Passwort) und man sich entsprechend auch damit anmeldet,
  • oder der Benutzer nur (mindestens) mit seinem AD-Accountnamen angelegt, und ein Haken "LDAP Authentifizierung" gesetzt wird. Nun prüft die Authentifizierung nicht gegen ein in der Datenbank eingetragenes Passwort, sondern gegen einen LDAP-Server.

Das funktioniert so schon perfekt.

Jetzt möchten wir optional beim LDAP-Login auch SSO anbieten.
Nun ist es ja so, dass ASP.NET Core mit Kestrel keine Windows-Authentifizierung unterstützt, sondern dies maximal vom IIS oder vom WebListener (HttpSys) unterstützt wird.

Der IIS fällt raus, da wir in der Anwendung auch noch andere Background-Tasks (dauerhafte Kommunikation mit externen Schnittstellen) ausführen müssen, und ich diese nicht im IIS-Prozess durchführen möchte.

WebListener wäre eine Alternative, allerdings unterstützt der WebListener scheinbar keine Cookie-Authentifizierung mehr, wenn Windows Authentifizierung aktiviert ist. (https://github.com/aspnet/HttpSysServer/issues/284)

Also muss ich irgendwie bei Kestrel bleiben, was mir eigentlich auch ganz recht ist, da plattformunabhängig.

Nun bin ich über folgenden Stack-Overflow-Eintrag gestoßen:
https://stackoverflow.com/questions/34956808/asp-net-vnext-kestrel-windows-authentication
In der Lösung wurde ein ActionFilter gebaut, der eine NTLM-Authentifizierung simuliert. Simuliert deswegen, weil die Credentials nicht gegen einen LDAP-Server validiert werden, sondern nur der Username und Domain aus der NTLM-Authentifizierung herausgelesen werden.
Eigentlich genau das, was ich brauche, und es funktioniert auch wunderbar. Nur sehe ich hier eine große Sicherheitslücke.

Daher kann dieser Thread in min. zwei Richtungen verlaufen:

  1. gibt es Alternativen ein SSO mit Kestrel durchzuführen?
  2. hat schon jemand Erfahrungen, wie man die NTLM-Authentifizierung vollständig implementiert?

Btw. als LDAP-Library verwende ich Novell.Directory.Ldap.NETStandard2_0

30.07.2018 - 10:40 Uhr

Hmm, ich verstehe das Problem auch noch nicht so ganz...

folgender Code gehört für mich dann z.B. in den DAL:

public class ConfigEntity
{
  public String CompanyName { get; set; }

  public String Language { get; set; }
}

public interface IConfigRepository
{
  ConfigEntity GetConfig();

  void SaveConfig(ConfigEntity config);
}

public class IniConfigRepository : IConfigRepository
{
  const String iniFileName = "config.ini";

  public ConfigEntity GetConfig()
  {
    // Ini-Datei hier lesen und in Objekt mappen
    return new ConfigEntity()
    {
      CompanyName = "Ini-Wert",
      Language = "Ini-Wert"
    };
  }

  public void SaveConfig(Config config)
  {
    // Ini-Datei hier speichern
  }
}

Die konsumierenden Layer wissen nun also nicht, dass es sich um eine Ini-Datei handelt. Im BL wird "ConfigEntity" nun wieder in ein Business-Model "Config" gemappt. -> genau so wie die Entities die aus einer Datenbank kommen.

30.07.2018 - 08:45 Uhr

@Palin
Was sind das denn für Ini-Files?
In der Regel gibt es doch eine feste Definition, wie so ein Ini-File aussehen kann. Also kann man das Ini-File doch genau so im DAL zu Objekten mappen wie das Entity-Framework dies mit den SQL-Daten macht.

So ist es den darüber liegenden Layern total egal, ob die Daten aus einem Ini-File oder einer Datenbank kommen.

Oder missbraucht ihr hier das Ini-File irgendwie als unstrukturierte Datenbank? In dem quasi alles mögliche drin stehen kann?

26.07.2018 - 13:59 Uhr

@MorphieX
Bei der Disskusion zu Drei Schichten Architektur ist ein wirklich einfaches Beispiel zu finden.

Meinst du "ProductCatalogue"? Ich weiß ja nicht...
Im Prinzip ist in dem Beispiel alles vom DataSet abhängig, und damit meine ich nicht unbedingt die Daten, sondern die Technologie. Für mich (und das ist meine persönliche Meinung) liegt die Schwierigkeit der Schichtentrennung in den Schnittstellen zwischen den einzelnen Schichten, und genau das wird in dem Beispiel meiner Meinung nach falsch dargestellt, aber das ist ein allgemeines Problem bei WinForms, bzw. Binding an DataSources.

Aber ich habe gerade ein -auf den ersten Blick- sehr vielversprechendes Projekt gefunden:
https://github.com/JonPSmith/SampleMvcWebApp

Das werde ich mir mal genauer anschauen

25.07.2018 - 10:55 Uhr

Was haltet ihr davon, wenn wir (die Community) ein Beispielprojekt erarbeiten, auf welches man dann im [Artikel] Drei-Schichten-Architektur bzw. unter die regelmäßig gestellten Fragen zu diesem Thema verlinken könnte?

So simpel wie möglich und so komplex wie nötig.

Eventuell auch in unterschiedlichen Variationen, z.B. ohne Tools wie AutoMapper oder EF (damit man wirklich sieht was da eigentlich passiert) und mit Tools, damit man sieht was man an Arbeit spart 😉

Ich habe zumindest überall nur Beispiele gefunden, die entweder falsch; viel zu komplex oder viel zu simpel gehalten sind.

Das wäre aus meiner Sicht ein echter Mehrwert.

24.07.2018 - 12:35 Uhr

Wo wird denn gemappt?
Wenn ich den BL wirklich als eigene Assembly führe, werden die Entities doch im BL in Business Objects gemappt. Und wenn ich nun eine Änderung an meine Entities vornehme, muss ich das Mapping ggf. anpassen, somit also den BL, oder?
Ich muss ja schließlich auch meine Business Objects anpassen, da die Änderung an den Entities (z.B. neues Datenbankfeld) auch im Business Object ankommen soll.

Oder findet das Mapping im DAL statt?

Beispiel:
Ich habe eine Entität "PersonEntity"

  • ID
  • Nachname
  • Vorname

Ich habe dazu das BusinessObject "Person"

  • ID
  • Nachname
  • Vorname
  • VollstaendigerName

Nun erweitere ich meine Entity:

  • ID
  • Nachname
  • Vorname
  • Anrede

also muss ich auch das BusinessObject anpassen:

  • ID
  • Nachname
  • Vorname
  • Anrede <- neu
  • VollstaendigerName <- das Mapping muss ebenfalls angepasst werden

Gut, man könnte jetzt sagen dass das Mapping nicht im BL stattfindet, weil es woanders konfiguriert wird (z.B. AutoMapper-Config) und dass die BusinessObjects nicht unbedingt im BusinessLayer definiert sein müssen, sondern z.B. in der Infrastructure, aber das eigentlich gehört das für mich zum BL

24.07.2018 - 10:33 Uhr

Danke 😄

Ich glaube ihr habt mir jetzt ein wenig die Augen geöffnet.

Könnt ihr mir vielleicht ein Praxis-Beispiel nennen, bei dem sich das Business-Objekt von der Entität unterscheidet? Theoretisch muss ein Business-Objekt doch auch über eine eindeutige ID und den Merkmalen der Entität verfügen.

Ich finde diese minimal-Beispiele von MS (und zig anderen) mittlerweile echt kontra-produktiv...

@Abt, bzgl. der Technologie-Auswahl werde ich damit loslegen, sobald ich das mit der Schichtentrennung sauber habe. Danke noch mal für den Hinweis. Ich habe das vielleicht doch als zu einfach empfunden.

24.07.2018 - 10:05 Uhr

Hallo Abt,

danke für deine Antwort 😃

Und in der Logik arbeitet man mit Domain Objects.

So hatte ich es tatsächlich schon mal umgesetzt. Fühlte sich aber irgendwie nicht richtig an, weil viel Aufwand für (bislang) keinen zusätzlichen Nutzen. Aber ich werde es dann doch noch mal so versuchen.
Frage: Wenn es wirklich eine 1:1-Kopie ist, erbst du dann von der Entität?

Ob Du das wirklich in Assemblies aufbauen musst; das ist nen Philosophie-Thema.

Im Moment hilft mir das, die Schichten nicht versehentlich zu durchbrechen. Ich denke wenn man da ein bisschen mehr Übung drin hat, kann man es sicher auch wagen die Schichten in einer gemeinsamen Assembly zu halten.

Aber zu Deiner Technologieauswahl....

Hehe, mir war klar dass das sofort kommt 😉 Du hast ja auch absolut recht.
Im Moment "spiele" ich auch noch mit der Architektur und auch mit den Technologien. Genau diese beiden Schichten wollte ich aber absichtlich als nächsten "Meilenstein" austauschen.
Ich möchte ein Gefühl dafür bekommen, einzelne Programmteile in einer sauberen Architektur austauschen zu können. - wenn das ohne große Anpassungen in den anderen Programmteilen funktioniert, dürfte die Schichtentrennung doch erfolgreich gewesen sein.
Und wenn ich sage, dass das Projekt über mehrere Jahre gepflegt wird, dann gehe ich davon aus, dass irgendwann ein weiterer Technologiewechsel erfolgen wird.

24.07.2018 - 08:18 Uhr

Hallo,

ich fange gerade an meine erste größere Anwendung zu entwickeln und weiß jetzt schon, dass sie über Jahre wachsen und wahrscheinlich von unterschiedlichen Mitarbeitern gepflegt wird.
Daher lege ich großen Wert auf eine möglichst saubere Architektur von Anfang an.

Folgendes ist gegeben:

Infrastructure Assembly

  • Interfaces für DI, z.B. IRepository, IUnitOfWork, IUserResolver,...
  • Entitiy-Klassen und dazugehörige Enums

Data Access Assembly

  • Entity Framework 6.2
  • Auditing (also auch etwas Logik)
  • Zugriff auf Infrastructure Assembly

Business Logic Assembly

  • Implementierung der Repositories, UnitOfWork,...
  • Utilities, z.B. Passwort-Verschlüsselungen
  • Security
  • Zugriff auf Infrastructure Assembly
  • Zugriff auf Data Access Assembly

Presentation Layer

  • Hauptprojekt
  • ASP.NET MVC 5 (ja, kein ASP.NET MVC Core, das ist momentan Absicht, wird aber später sicherlich ausgetauscht
  • In den Controllern werden meist CRUD-Operationen über die Repositories durchgeführt.
  • jede View hat ein eigenes ViewModel, gemappt wird per AutoMapper
  • Abhängigkeiten werden per DI aufgelöst
  • Zugriff auf Business Logic Assembly
  • Zugriff auf Infrastructure Assembly

Meine Projektstruktur sieht also zusammengefasst so aus:

[Presentation Layer] -> [Business Layer] -> [Data Access Layer]
[                      Infrastructure Layer                   ]

Nun zu meinen Fragen:

  1. Gehört die Implementierung des Repositories in den BLL oder in die DAL? Ich habe halt Geschäftslogik in meinen Repositories.

  2. Ich benutze im BLL die Entities, die mir das Entity Framework liefert. Das funktioniert so.
    Ich lese aber in fast allen theoretischen Artikeln, dass da noch Business Objects dazwischen gehören. Also habe ich das mal ausprobiert und auch gleich wieder rückgängig gemacht, da ich gemerkt habe dass das 100% 1:1-Kopien meiner Entities waren. 😉 Irgendwas verstehe ich hier also noch nicht richtig.
    Bisher habe ich auch noch kein Beispiel gefunden, bei dem das so gemacht wurde. Hat jemand einen Link zu einem entsprechenden Beispiel?
    Sind eigene Business Objects bei Verwendung des Entity Frameworks vielleicht gar nicht notwendig?
    Später kommen noch Objekte hinzu, die nicht (sofort) im Entity Framework landen - da kann ich mir das sehr gut vorstellen.

14.06.2018 - 11:43 Uhr

Okay, Danke 😃
Dein 2. Hinweis hat mich zum Ziel gebracht.

Ich bin davon ausgegangen dass es durchaus Sinn ergibt, auch die Entities zu entkoppeln, da ich Service -und Datenzugriffsschicht eigentlich trennen wollte. So könnte eine Entität aus einer Datenbank durchaus mehr oder weniger Eigenschaften benötigen als z.B. Entitäten aus einer OPC-Schnittstelle.

Aber darüber mache ich mir dann Gedanken

14.06.2018 - 11:17 Uhr

Hallo zusammen,

ich stehe gerade ein wenig auf dem Schlauch...
Ich starte gerade ein neues MVC-Projekt und möchte den Datenzugriff möglichst mit Interfaces entkoppeln. Dazu möchte möchte ich gerne ein generisches Repository als Basisklasse verwenden und davon meine spezifischen Repositories ableiten.

Ich habe dazu mal ein Minimalbeispiel erstellt.

Folgende Interfaces habe ich eingeführt:


public interface IEntityBase
{
  int Id { get; set; }
}

public interface IRepositoryBase<T> where T : IEntityBase
{
  T FindById(int id);
}

public interface IArtikel : IEntityBase
{
  String Name { get; set; }
}

public interface IArtikelRepository : IRepositoryBase<IArtikel>
{
  void DoSomething();
}

Daraus habe ich dann folgende Implementierungen erstellt:


public class EntityBase : IEntityBase
{
  public int Id { get; set; }
}

public class RepositoryBase<T> : IRepositoryBase<T> where T : IEntityBase
{
  public T FindById(int id)
  {
    // Irgendein Code:
    return Activator.CreateInstance<T>();
  }
}

public class Artikel : EntityBase, IArtikel
{
  public String Name { get; set; }
}

public class ArtikelRepository : RepositoryBase<Artikel>, IArtikelRepository
{
  public void DoSomething()
  {
    Console.WriteLine("...");
  }
}

Bei dem ArtikelRepository möchte ich also das IArtikelRepository implementieren, wovon das RepositoryBase aber schon die Methode FindById implementiert.
Ich gebe bei FindById T zurück, was im ArtikelRepository vom Typen Artikel ist. Artikel besitzt das Interface IArtikel - genau das erwartet IArtikelRepository auch.

Ich bekomme bei diesem Konstrukt aber folgende Fehlermeldung:> Fehlermeldung:

"ArtikelRepository" implementiert den Schnittstellenmember "IRepositoryBase<IArtikel>.FindById(int)" nicht. "RepositoryBase<Artikel>.FindById(int)" hat nicht den entsprechenden Rückgabetyp "IArtikel" und kann "IRepositoryBase<IArtikel>.FindById(int)" daher nicht implementieren.

Mir ist schon klar, dass IArtikelRepository als Rückgabewert ein "IArtikel" erwartet, ich aber ein "Artikel" zurückgebe. Aber Artikel ist doch IArtikel?! Ich bin etwas verwirrt...

Kann mich jemand aufklären? 😃

26.04.2018 - 15:45 Uhr

Vielleicht wäre auch ein Scripting-Framework (Roslyn Scripting?) für dich interessant?
So dass du ein entsprechendes Script direkt mit in die DB schreibst.

Das hängt natürlich immer davon ab was du später verarbeiten möchtest und auch das Thema Security dürfte dann wichtiger werden. Dafür wärst du möglicherweise aber sehr flexibel.

05.02.2018 - 11:43 Uhr

Ich würde mich hier gerne mal einklinken und zum Thema "Prozesskommunikation über ein Netzwerk realisieren" zurückkehren.

Wenn es also darum geht zwei Prozesse miteinander kommunizieren zu lassen, starte ich in min. einem Prozess einen HTTP-Server, der dann entweder REST oder ähnliches versteht.

Das Problem, welches ich schon mehrmals hatte ist, dass mir die Windows-Firewall per default nicht erlaubt einen HTTP-Server zu hosten. Dazu benötigt der Prozess entweder eine höhere Berechtigung oder ich muss dies explizit in der Windows Firewall freigeben.

Ist das bei euch nicht so? Gibt es da workarounds?

17.01.2018 - 11:22 Uhr

Okay, habe ich mir schon gedacht dass ich da händisch eine Unterscheidung machen muss...
Danke 😃

17.01.2018 - 10:33 Uhr

Hallo zusammen,

ich weiß nicht genau ob ich den passenden Forenbereich gewählt habe. Wenn nicht dann bitte verschieben.

Ich programmiere mir gerade eine Anwendung, die mit unserer Alcatel-Telefonanlage kommunuziert und mich über Anrufe usw. informiert. Ich weiß, sowas ist eigentlich über TAPI / CAPI umzusetzen, allerdings unterstützt das unsere Telefonanlage in der aktuellen Lizensierung nicht.

Dafür hat die Telefonanlage aber eine API, die ich benutzen kann. Das läuft quasi so ab:

  1. Ich melde mich an der API (SOAP, WSDL) mit Benutzernamen und Passwort an und bekomme eine sessionID zurück.
  2. Ich kann der Telefonanlage dann sagen, dass ich mich gerne über alle Ereignisse informieren möchte (subscribe events), dazu muss ich eine URL angeben, die die Telefonanlage dann antriggert (habe ich über einen lokalen HTTPListener gelöst) und die von oben genannte sessionID, damit sie weiß für welchen Mitarbeiter das Events ausgelöst werden soll.
    Die Telefonanlage ruft dann die URL entsprechend auf und übermittelt im RequestBody entsprechende Informationen als XML. Je nachdem welche Informationen die Telefonanlage meldet, kann der XML-Aufbau komplett anders sein. Es gibt also eine hand voll Events, die immer an dieselbe URL übermittelt werden.

Meine Frage: Wie kann ich diese XML-Daten möglichst elegant auswerten? Natürlich könnte ich das XML irgendwie analyiseren und mich von node zu node bewegen, aber schöner fände ich es, wenn ich mir das irgendwie in eine Klasse deserialisieren könnte...
Leider ist das XML halt von Fall zu Fall unterschiedlich, so dass ich nicht sofort weiß in welche Klasse ich den Content deserialisieren könnte. Gibt es hier eine einfache Möglichkeit, die ich noch nicht kenne?

Also einmal sieht das XML z.B. so aus:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <ns1:onCallState soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://xmlapi.alcatel.com/phone">
   <sessionId xsi:type="xsd:string">0-1516180619</sessionId>
   <calls xsi:type="soapenc:Array" soapenc:arrayType="ns1:Call[1]" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
    <item>
     <callRef xsi:type="xsd:long">10836</callRef>
     <number xsi:type="xsd:string">123</number>
     <name xsi:type="xsd:string">Irgendein Mitarbeiter</name>
     <state xsi:type="ns1:CallState">ringingOutgoing</state>
     <correlator xsi:type="xsd:hexBinary" xsi:nil="true"/>
    </item>
   </calls>
  </ns1:onCallState>
 </soapenv:Body>
</soapenv:Envelope>

Oder mal so:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <ns1:onNomadState soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://xmlapi.alcatel.com/phone">
   <sessionId xsi:type="xsd:string">0-1516180619</sessionId>
   <mode xsi:type="ns1:NomadMode">local</mode>
   <homeNumber xsi:type="xsd:string" xsi:nil="true"/>
  </ns1:onNomadState>
 </soapenv:Body>
</soapenv:Envelope>

Das Problem ist, dass die Telefonanlage für alle Events dieselbe URL aufruft.

Ist etwas schwierig zu erklären, aber vielleicht versteht es ja jemand 😉

15.01.2018 - 09:50 Uhr

Die DevExpress-Controls z.B. berücksichtigen schon von Haus aus DataAnnotations, z.B. so unter WinForms: https://documentation.devexpress.com/windowsforms/18273/Common-Features/Data-Binding/Data-Annotation-Attributes

Wenn du also deine Datenklassen (oder ViewModels) designst, kannst du je nachdem welche Technologie du verwendest den einzelnen Properties (an die du ja später bindest) schon entsprechende DataAnnotations mitgeben, so dass der User schon mal z.B. zu lange Texte gar nicht erst eintragen kann.

Meine persönliche Erfahrung: Die DevExpress-Controls zusammen mit WPF und gescheitem MVVM passen gut zusammen. Das ViewModel bestimmt dort über DataAnnotations, welche groben Einschränkungen die View für die jeweiligen Properties umsetzen soll.

27.09.2017 - 07:46 Uhr

Hi,

wir sind gerade am rätseln ob wir für unsere internen Softwarelösungen (intranet, eigenes ERP-System, mobile Lösungen für unsere Lagermitarbeiter,...) die Community Edition verwenden dürfen oder ob wir uns dafür eine Professional-Edition kaufen müssen.

Unser Unternehmen hat mehr als 1 Mio Dollar Umsatz und wir sind insgesamt 3 Entwickler.
Die Software die wir mit VS entwicklen, wird allerdings ausschließlich intern eingesetzt und nicht verkauft.

Gibt es da eine Sonderregelungen oder so?

26.07.2017 - 07:04 Uhr

Wenn deine Wrapper-DLL korrekt angesprochen wird und es tatsächlich nur um die WinSCP.dll geht, dann könnte man die beiden DLLs eventuell mergen. (ILMerge)

24.07.2017 - 15:26 Uhr

Mir wurde mit auf den Weg gegeben, dass vermutlich ein TcpListener zielführend sein sollte.

Wenn das von dem Admin gekommen ist, tippe ich darauf, er meint dass die Firewall keine eingehenden Verbindungen zum Fileserver zulässt, sehr wohl aber ausgehende Verbindungen vom FileServer...

08.05.2017 - 15:16 Uhr
  1. der Client sendet eine Anfrage an den HTTP-Server (IIS, ASP.NET)
  2. der Server baut eine Verbindung zur SQL-Datenbank auf und erzeugt das Excel-File mitsamt formatierungen... Der Server verwendet zum Erzeugen des Excel-Files ggf. openXML.
  3. der Server liefert das fertige Excel-File als Ergebnis der Anfrage zurück.
  4. der Client kann diese Datei jetzt abspeichern und/oder öffnen.

Das wäre wohl der saubere weg.

12.04.2017 - 11:15 Uhr

Notlösung: Einen eigenen HttpListener in der Anwendung hosten und das WebBrowser-Control verwenden...?

14.03.2017 - 22:08 Uhr

Schade, habe leider schon vor einem Monat die Tickets geordert... Hätte ich mal noch gewartet 😉

29.12.2016 - 14:08 Uhr

Und das Interface ist an dieser Stelle überflüssig, weil es gar nicht verwendet wird 😉

19.12.2016 - 07:34 Uhr

Hast du dir im Taskmanager auch schon mal die GDI-Objekte angesehen? Ich weiß nicht, ob WPF überhaupt irgendwie GDI benutzt, aber unter Windows Forms könnte das auch ein möglicher Grund sein.

09.12.2016 - 14:18 Uhr

Dein Problem ist immer noch, dass die Anwendung nicht versteckt startet, oder?
Hier mein Code um notepad.exe versteckt zu starten:

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "notepad.exe";
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
Process proc = Process.Start(startInfo);

Und hier um den Internet Explorer versteckt zu starten:
~~

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "iexplore.exe";
startInfo.Arguments = "-embedding";
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
Process proc = Process.Start(startInfo);

~~
Edit: vergiss es, da war ich etwas zu voreilig....

24.11.2016 - 07:05 Uhr

Es gibt schon einige wichtige Features, die erst nach VS2010 dazu kamen, wie z.B. async / await.
Das kannst du zwar im VS2010 nachrüsten, soweit ich weiß, aber ich bezweifele doch stark, dass sich das Buch damit beschäftigt.

17.11.2016 - 07:09 Uhr

Hast du den Quellcode von dem Pogramm?
Dann kannst du ja einfach (z.B. beim Start) prüfen ob der WebService erreichbar ist.
Ist es ein "Fremdprogramm", sprich du kannst darin nichts ändern, dann könntest du eine Art "Launcher" davor schalten, mit dem du das eigentliche Programm startest, wenn der Webservice erreichbar ist.

edit: das ist natürlich keine 100%ig Sperrung. Der User kann natürlich jederzeit selbst das eigentliche Programm starten, ohne den Launcher zu benutzen...

29.09.2016 - 15:52 Uhr

Es geht doch um einen Passwort-Manager, oder?
Ein Hash würde die Funktionsweise eines Passwort-Managers doch komplett zerstören, oder?

23.09.2016 - 07:57 Uhr
SELECT km.Monat
	,km.Tag
	,COUNT(km.tag) - (
		SELECT COUNT(tag) * 2
		FROM [datenbank]
		WHERE ausweisnr <> '0001234567'
			AND Storno = 1
			AND monat = km.Monat
			AND tag = km.Tag
		)
FROM [datenbank] AS km
WHERE km.ausweisnr <> '0001234567'
GROUP BY km.Monat
	,km.Tag
ORDER BY km.monat
	,km.tag

So in etwa?

25.08.2016 - 11:51 Uhr

Guter Einwand. 😉
Kommt natürlich immer darauf an, in welchem Maße man die Schichtentrennung umsetzt und mit welcher Technologie man gerade zutun hat.

Ich persönlich arbeite mich gerade in eine ERP-Software (Fremdprodukt) ein, in der die Logik in einem Java-Applikationsserver stattfindet und das Frontend eine ASP.NET-Anwendung ist, die im Prinzip nur die Webservices vom Applikationsserver aufruft. Bei dieser Lösung werden die Java-Exceptions tatsächlich bis in die ASP.NET-Anwendung durchgereicht und dort dem User in aufbereiteter / übersetzter Form präsentiert.

25.08.2016 - 10:10 Uhr

Ein Bool hätte aber nur 2 Zustände. Ich denke eine Verbindung kann aufgrund ganz verschiedener Ursachen nicht aufgebaut werden. Daher benötigt der User eine entsprechende Erklärung, die ihm ein Bool-Wert nicht bieten kann.
Ich würde eine Exception werfen, die in der UI-Schicht abgefangen und entsprechend ausgegeben wird.