Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Alf Ator
Thema: [gelöst] Entity Framework + Repository Pattern: Best Pratice gesucht
Am im Forum: Datentechnologien

Ich habe zu dem Thema auch noch ein paar interessante Links gefunden. Ich muss mich anscheinend über gewisse Dinge noch einlesen. Wenn ich durch bin, werde ich meine entsprechende Lösung hier posten. Danke für die Anregungen und Hilfe.

Fragen Entity Framework, Repository Pattern und Schichtentrennung
Lebensdauer Entity Framework (Context)
Using Repository and Unit of Work patterns with Entity Framework 4.0
Developer's Guide to Dependency Injection Using Unity
Implementing the Repository and Unit of Work Patterns in an ASP.NET MVC Application (9 of 10)

Thema: [gelöst] Entity Framework + Repository Pattern: Best Pratice gesucht
Am im Forum: Datentechnologien

Ich versteh das alles nicht. ?( ?( 8o X(

Bestimmte Repositories müssen doch den gleichen DbContext verwenden.
Diese Abhängigkeiten sollen aber nur im DAL bekannt sein.
Der Service im BL bekommt also Repositories injected, kennt die Abhängigkeiten aber nicht.

Die Abhängigkeiten müssen aber irgendwo gehalten werden, richtig?

Also habe ich eine statische DatabaseInstance erstellt, die die UnitOfWorks hält und über die die Repositories geholt werden können.


public class CategoryService
{
    public CategoryRepository Categories { get; private set; }

    public CategoryService(CategoryRepository categories)
    {
        this.Categories = categories;
    }

    public void Commit()
    {
        this.Categories.Save();
    }
}

public static class ServiceFactory
{
    public static CategoryService CreateCategoryService(ILoginCredentials loginCredentials)
    {
        return new CategoryService(DatabaseInstance.GetCategoryRepository(loginCredentials)); ;
    }
}

public static class DatabaseInstance
{
    private static CategoryUnitOfWork _categoryUnitOfWork;

    public static CategoryRepository GetCategoryRepository(ILoginCredentials loginCredentials)
    {
        if (_categoryUnitOfWork == null)
            _categoryUnitOfWork = UnitOfWorkFactory.CreateCategoryUnitOfWork(loginCredentials);

        return _categoryUnitOfWork.Categories;
    }
}

Thema: [gelöst] Entity Framework + Repository Pattern: Best Pratice gesucht
Am im Forum: Datentechnologien

Zitat von Abt
...
Und sauber testbar ist das ganze auch nicht. Repositories sollte man in die Services via Dependency Injection übergeben
...

Ich habe das nochmal angeschaut und mittels FactoryPattern gelöst:


public static class UnitOfWorkFactory
{
    public static CategoryUnitOfWork CreateCategoryUnitOfWork(ILoginCredentials loginCredentials)
    {
        var context = new ToolContext(loginCredentials);
        var categoryUnitOfWork = new CategoryUnitOfWork();
        categoryUnitOfWork.SetCategoryRepository(RepositoryFactory.CreateCategoryRepository(context));
        categoryUnitOfWork.SetUsageRepository(RepositoryFactory.CreateRepository<Usage>(context));
        categoryUnitOfWork.SetTaskTypeRepository(RepositoryFactory.CreateRepository<TaskType>(context));
        return categoryUnitOfWork;
    }
}



public class CategoryService
{
    private readonly CategoryUnitOfWork _unitOfWork;
        
    public CategoryService(ILoginCredentials loginCredentials)
    {
        _unitOfWork = UnitOfWorkFactory.CreateCategoryUnitOfWork(loginCredentials);
    }

    public void Commit()
    {
        _unitOfWork.Categories.Save();
        _unitOfWork.Usages.Save();
        _unitOfWork.TaskTypes.Save();
    }
}

Thema: [gelöst] Entity Framework + Repository Pattern: Best Pratice gesucht
Am im Forum: Datentechnologien

Hallo Abt,

Zitat von Abt
Dein Service ist dein Unit Of Work oder was soll das heissen? :baby:
...
und der Service sollte vom Context gar nichts wissen.
Das wäre eine Schichtverletzung in meinen Augen.

Um dich richtig zu verstehen:
Services sind bei dir im BL angesiedelt? Dort sollte vom Context nichts zu sehen sein.


public class CategoryService
{
    private readonly CategoryUnitOfWork _unitOfWork;
        
    public CategoryService(ILoginCredentials loginCredentials)
    {
        _unitOfWork = new CategoryUnitOfWork(loginCredentials);
    }
}

Das UnitOfWork ist im DAL angesiedelt und mein CategoryService ist in Wirklichkeit ein UoW und ich nenne es deswegen auch mal so:


    public class CategoryUnitOfWork : IUnitOfWork
    {
        private readonly ToolContext _context;

        public RepositoryBase<Category> Categories { get; private set; }
        public RepositoryBase<Usage> Usages { get; private set; }
        public RepositoryBase<TaskType> TaskTypes { get; private set; }

        public CategoryUnitOfWork(ILoginCredentials loginCredentials)
        {
            _context = new ToolContext(loginCredentials);

            this.Categories = new RepositoryBase<Category>(this._context);
            this.Usages = new RepositoryBase<Usage>(this._context);
            this.TaskTypes = new RepositoryBase<TaskType>(this._context);
        }
    }
Zitat von Abt
...
Und sauber testbar ist das ganze auch nicht. Repositories sollte man in die Services via Dependency Injection übergeben
...

Das verstehe ich jetzt nicht ganz: Um die Repositories zu erstellen muss ich doch den Context haben und der ist nur im UoW bekannt.
Zitat von Abt
Das ist eigentlich der Inhalt eines Repositories; nicht eines Services.
Spezifisch erweiterbar sind Deine Repositories so übrigens nicht.

Also besser so:


public class CategoryRepository : RepositoryBase<Category>
{
    public CategoryRepository(ToolContext context) : base(context) { }

    public IQueryable<Category> GetCategoriesByUsageName(string usageName)
    {
        return this.FindBy(categoryItem => categoryItem.Usages.Any(usageItem => usageItem.Name == usageName));
    }
}


Ich glaube mein Thema hat nichts mehr mit dem Ursprünglichen zu tun. Vielleicht sollte man das in einen eigenen Thread verschieben.

Thema: [gelöst] Entity Framework + Repository Pattern: Best Pratice gesucht
Am im Forum: Datentechnologien

Hallo Mossi,

so könnte eine entsprechende UnitOfWork aussehen.
Für den Scope existiert ein Context. Andere UnitsOfWork sollten sich mit diesem nicht in die Quere kommen.
Pro Table ein Repository.


public class CategoryService // = UnitOfWork
{
	private readonly Context _context;

	public RepositoryBase<Category> Categories { get; private set; }
	public RepositoryBase<Usage> Usages { get; private set; }
	public RepositoryBase<TaskType> TaskTypes { get; private set; }

	public CategoryService(string server, string user, string password)
	{
		this._context = new ToolContext(server, user, password);
		this.Categories = new RepositoryBase<Category>(this._context);
		this.Usages = new RepositoryBase<Usage>(this._context);
		this.TaskTypes = new RepositoryBase<TaskType>(this._context);
	}
}

So ein das Repository-Interface mit den standardmässigen ACID-Methoden:


public interface IGenericRepository<TEntity> where TEntity : class
{
    IQueryable<TEntity> GetAll();
    TEntity GetSingle(int id);
    IQueryable<TEntity> FindBy(Expression<Func<TEntity, bool>> predicate);
    void Add(TEntity entity);
    void Delete(TEntity entity);
    void Edit(TEntity entity);
    void Save();
}

Erweitertes Informations-Bedürfnis könnte auch im UnitOfWork befriedigt werden:


public class CategoryService // = UnitOfWork
{
    ....

    public IQueryable<Category> GetCategoriesByUserId(int userId)
    {
        return this.Categories.FindBy(categoryItem => categoryItem.id_user == userId);
    }
}



Gruß, Alf

Thema: Eventhandler in C#
Am im Forum: GUI: Windows-Forms

Hallo VIERcntHOLZ,

Bei VB gibts ja:

AddHandler event, AddressOf eventhandler

Das ist die C#-Variante in grün. So wie sie Th69 angegeben hat.
Der EventHandler für WindowsForms-Controls wird meistens in der entsprechenden Designer-Datei zu finden sein.

Schöne Grüße, Alf

Thema: Tastatureingabe durch Barcodescanner abfangen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo basstscho,

ich hatte mich mal mit dem Thema beschäftigt und folgende Lösung verwendet:

Distinguishing Barcode Scanners from the Keyboard in WinForms

Using Raw Input from C# to handle multiple keyboards

Hat funktioniert, ist allerdings nicht sehr einfach umzusetzten.

Gruß, Alf

Thema: Diskussion zum Artikel: Drei-Schichten-Architektur
Am im Forum: Rund um die Programmierung

Hallo ErfinderDesRades,

ich hatte mich tatsächlich an dein Projekt drangesetzt und hatte dabei festgestellt, dass die 3-Schichten-Architektur erst dann Sinn macht, wenn man das Projekt entsprechend erweitert wird.

Das habe ich jetzt nicht weiterverfolgt, werde das in den nächsten Tagen aber mal umsetzten.

Imho ein prima Beispiel, wie einem so eine Anwendung über den Kopf wachsen und durch 3-Schichten-Architektur wieder übersichtlich gemacht werden kann.

Gruß, Alf

Thema: Hex-String zu lesbaren String konvertieren
Am im Forum: Grundlagen von C#

Hallo,

ich habe das jetzt folgendermaßen gelöst:


static void Main(string[] args)
{
    string hexString = "45 72 73 74 65 72 21 20 56 69 65 6c 65 6e 20 44 " +
                        "61 6e 6b 20 66 fc 72 20 64 69 65 20 48 69 6c 66 " +
                        "65 20 75 6e 64 20 6c 69 65 62 65 20 47 72 fc df " +
                        "65 20 61 6e 20 64 61 73 20 46 6f 72 75 6d 2e ";
    string convertedHexString = ConvertHexStringToString(hexString);

    Console.WriteLine(convertedHexString);
    Console.ReadLine();
}

private static string ConvertHexStringToString(string hexString)
{
    string result = "";

    foreach (string hexPart in hexString.Trim().Split(' '))
    {
        result += ConvertHexPartToString(hexPart);
    }

    return result;
}

private static string ConvertHexPartToString(string hexPart)
{
    int value = Convert.ToInt32(hexPart, 16);
    return Char.ConvertFromUtf32(value);
}


Der Ergebnisstring ist übrigens folgender:
Zitat
Erster! Vielen Dank für die Hilfe und liebe Grüße an das Forum.

Thema: Hex-String zu lesbaren String konvertieren
Am im Forum: Grundlagen von C#

Hallo liebe Forenteilnehmer,

ich versuche einen Hex-String in einen lesbaren String umzuwandeln.
Ich habe dafür die Funktion Convert.ToString versucht. Es werden aber
immer noch nur die Hex-Werte angezeigt.

Wie kann ich das denn Konvertieren?


string hexString = "45 72 73 74 65 72 21 20 56 69 65 6c 65 6e 20 44 61 6e 6b 20 66 fc 72 20 64 69 65 20 48 69 6c 66 65 20 75 6e 64 20 6c 69 65 62 65 20 47 72 fc df 65 20 61 6e 20 64 61 73 20 46 6f 72 75 6d 2e";
string result = Convert.ToString(hexString);
Console.WriteLine(result);

Viele Grüße, Alf

Thema: Mein Ausscheiden aus dem myCSharp.de-Team
Am im Forum: Ankündigungen

Danke für deinen Einsatz, herbivore!

Thema: Wieso Model, wenn man das ViewModel nutzen kann?
Am im Forum: GUI: WPF und XAML

Hallo Exis,

Hier der Link von oben nochmal in deutsch: https://msdn.microsoft.com/de-de/magazine/dd419663.aspx

Es ist eigendlich alles schon gesagt worden. Wenn du mal ein komplexeres Projekt hast, erklärt sich MVVM quasi von selbst.
Bei so kleinen Projekten kann man MVVM auch mal MVVM sein lassen. Genau das, was deine Frage aufgeworfen hat.

Gruß, Alf

Thema: Space Opera (C#, Unity)
Am im Forum: Projekte

Zitat von Abt
Ich bin kein Fan von Spielen aber auch begeistert von Deinem Elan.
Lass Dich also nicht davon beeinflussen, dass wenig Leute antworten - ich bin auch nur der stille Leser ;-)

Dito!

Thema: Binding an eine observablecollection<Model>[0].List<Model2>
Am im Forum: GUI: WPF und XAML

Hallo Rioma,

wenn du das Model direkt in der View bindest, dann musst du wohl einen 'unschönen' Weg gehen, der View aus dem Model heraus das Update mitzuteilen.

Möglicherweise könntest du auch das Binding aktualisieren, wenn du ein Object in List<Model2> einfügst. Auch nicht wirklich schön. :P

Beste Grüße, Alf

Thema: Entwickler alter Schule vs. neues Projekt. Wie reagieren?
Am im Forum: Smalltalk

Danke schön für eure Antworten. Mir kamen schon echte Zweifel, ob ich mit meinem Kram nicht total auf dem Holzweg bin. Der andere Entwickler hat immerhin schon über 20 Jahre Berufserfahrung.
Ich bin in der Situation ruhig geblieben und habe versucht zu begründen, warum ich das so uns so gemacht habe.
Ein Beispiel: Ich habe eine modular zusammensetzbare GUI entwickelt. Geschäftslogik und Module werden in unterschiedlichen Projekten organisiert. Er ist der Meinung, dass das unnötiger Overhead ist, wenig bringt und nur zusätzliche Arbeit macht. Ich habe das so gemacht, um die Wartbarkeit und Übersichtlichkeit meines Projektes zu erhöhen. Wenn man offen drüber nachdenkt, hat das was er sagt auch seine Berechtigung. Vielleicht muss man da einen Mittelweg finden.

@herbivore
Richtig, ich wechsel den Arbeitgeber. Die alte Firma ist klein und liegt mir wegen Chef und Kollegen auch am Herzen. Es ist mir also leider nicht egal, wie es da weiter geht.

@Coder007
Durch seine Haltung spricht er mir ja die Kompetenz ab. Ich werde in darauf hinweisen, dass das so nicht in Ordnung ist.

Mit meinen Projekten muss er weiterarbeiten. Vielleicht kann ich ihm meine Entwickler-Welt dann etwas näher bringen.

Vielen Dank nochmal für die Antworten. Schöne Grüße, Alf

Thema: Entwickler alter Schule vs. neues Projekt. Wie reagieren?
Am im Forum: Smalltalk

Hallo Zusammen!

Wegen Arbeitgeberwechsel, übergebe ich meine Projekte an einen Kollegen.
Das Problem: Ich habe immer versucht meine Projekte nach aktuellem Erkenntnisstand zu entwickeln. Dass heisst, ich versuche mich nach Designpatterns wie MVVM und Vorgaben nach Clean Code Developers zu richten. Der o.g. Entwickler ist negativ gegenüber Microsoft und C#.NET eingestellt. Projektstrukturen und andere Sachen, die ich entworfen habe, findet er wortwörtlich Pisskacke. Er enwickelt mit Embarcadero C++.

Wie soll man in so einer Situation denn bitte reagieren?

Viele Grüße, Alf

Thema: Strings in Listbox immer gleich lang machen
Am im Forum: GUI: Windows-Forms

Hallo STF-DIR,

die Methode, die du suchst heisst String.PadRight.

Gruß, Alf


Edit:
Was natürlich auch etwas ausmacht, ist die Schriftart. Verwende am einfachsten eine Schrifart, mit gleicher Länge pro Zeichen. Das nennt sich Monospace oder so.

Thema: Datenbankanwendungen richtig und Zeitgemäß programmieren
Am im Forum: Datentechnologien

Klare Ansage. Das gibt mir jetzt zu denken, da ich für ein größeres Projekt mit vielen Datensätzen (10 Mio+) das Entity Framework einsetzten will.

Thema: Datenbankanwendungen richtig und Zeitgemäß programmieren
Am im Forum: Datentechnologien

Zitat von FZelle
Hast du Massendaten zu verarbeiten, ist weder DataSet noch ORMapper sinnvoll, sondern nur die DB Sprache ( SQL/NoSQL).

Das irritiert mich jetzt ein wenig. Sind moderne ORMapper wirklich so schlecht?

Thema: Programmpfad der gestarteten EXE extrachieren
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo NaCoder,

such doch mal im Forum nach "pfad der exe". Herbivore hat ein schönes FAQ dazu geschrieben.

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

Mein Programm ist auf 162875 Ergebnisse gekommen (Quersumme 29) ... X(

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

8o Ich habe gestern noch ein kleines Progrämmchen geschrieben, dass mir das ausrechnet und das läuft immer noch. Ist wohl ein bisschen langsam. Schöne Aufgabe.

Thema: [erledigt] XmlSerializer erstellt manchmal fehlerhafte Datei?
Am im Forum: Datentechnologien

Hallo Ralf,

das im XmlSerializer ein bug ist (zumindest so einer) halte ich erst mal für unwahrscheinlich. Der wird soviel benutzt, das wäre doch schon aufgefallen. Da es nur sporadisch auftritt, könnte ich mir vorstellen, dass ein threading-problem vorliegt. Möglicherweise versucht er gleichzeitig zwei mal in die Xml-Datei zu serialisieren.

Gruß, Alf

Thema: Formatierung und Prüfung des Text während der Eingabe (Textbox)
Am im Forum: GUI: Windows-Forms

Hallo Theo,

zu 2. noch ein kleine Idee, du könntest bei Bereichsüberschreitung den Text rot anzeigen, dann weiss der User bescheid, dass etwas nicht stimmt, kann aber trotzdem ungehemmt schreiben.

Gruß, Alf

Thema: Bestehende Applikation als Dienst installieren
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo med, es gibt Programme (z.B. Winserv), mit denen man andere Programme als Dienst ausführen lassen kann. Möglicherweise funktioniert das auch bei dir. Probier das doch mal aus.

Gruß, Alf

Thema: Nur die Child Nodes eines Tree Nodes ermitteln, die für Dateien, nicht für Ordner stehen
Am im Forum: GUI: Windows-Forms

Was ist, wenn ein Folder keine Files enthält?

Thema: Netzwerkverkehr rekonstruieren
Am im Forum: Netzwerktechnologien

Welche Antwort bekommt denn das Original? Und was sendet das Original darauf hin? Das müsste mit Wireshark ja auch ersichtlich werden. Ein praktisches Tool zum Netzwerk-Verkehr tracen ist auch: TcpTrace

Thema: BefSharp - Befunge Interpreter in C#
Am im Forum: Projekte

Hallo AyrA,

erstmal danke. Durch dein Projekt, habe ich mich mal mit esoterischen Programmiersprachen beschäftigt und mit deinem Programm sogar ein Hello World in Befunge geschrieben.
War etwas schwierig, weil Stop und ein paar weiter Optionen noch nicht ganz funktionieren.

Schönen Gruß, Alf

Thema: [erledigt] Null Werte aus String-Array entfernen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo falsecode,

probiers mal mit StringSplitOptions.RemoveEmptyEntries.

die Variable 'Path' solltest du besser klein schreiben. Es gibt nämlich schon eine Klasse Path im System.IO-Namespace.

Gruß, Alf

Thema: Datagrid datasource zu langsam bei vielen Spalten (>100)
Am im Forum: GUI: Windows-Forms

Hallo Mary81,

es hilft auch, das Neuzeichnen des DGV, während des Ladens, zu verhindern. Ich weiss jetzt leider nicht aus dem Kopf, wie das geht.

Gruß, Alf