Laden...
R
Repac3r myCSharp.de - Member
Ausbildung als FiAe Dabei seit 01.03.2014 57 Beiträge
Benutzerbeschreibung

Forenbeiträge von Repac3r Ingesamt 57 Beiträge

09.09.2016 - 08:12 Uhr

Schönen morgen euch,

ich spiele seit einer weile mit .NET Core und Docker rum.
Mittlerweile habe ich meine Infrastruktur so eingerichtet, dass nach erfolgreichen Durchlauf meines Master-Builds ein neuer Docker-Container erstellt wird, welcher meine Anwendung und die nötigen Ressourcen beinhaltet.

Meine Test-Anwendung verwendet für die persistenz eine MongoDB-Instanz.
Nun stellt sich für mich die Frage, wie ich am besten existierende Docker-Container update?

Mein Vorschlag sieht wie folgt aus:

  • Die MongoDB speichert seine Daten außerhalb des Docker-Containers ab (Host-System)
  • Ich stoppe den existierenden Container, lösche und starte den neuen Container
  • Der neue Container verweißt ebenso auf den DB-Ordner im Host-System.

Ist das ein valider Weg?

29.01.2016 - 13:34 Uhr

Schönen Mittag euch,

ich versuche gerade mittels Jenkins mir ein neues Buildprojekt anzulegen. Leider hapert es schon am VCS.

Unter Jenkins habe ich folgende Plugins installiert:*Git client plugin (1.19.2) *Git plugin (2.4.1)

Mein Repo-Url sieht wie folgt aus:

https://MarcelHoffmann@bitbucket.org/MarcelHoffmann/jenkins-build-test.git

So, versuche ich nun, über Jenkins mich mit diesem Repo zu verbinden, bekomme ich folgende Fehlermeldung:> Fehlermeldung:

Failed to connect to repository : Could not init C:\Windows\TEMP\hudson8429009242105104933tmp

Habt ihr vlt eine Idee, woran dass liegen kann?

Grüße

//Edit: Mein Fehler, der Default-Pfad zu GIT war falsch gesetzt.

13.11.2015 - 07:14 Uhr

Schönen Morgen euch,

vielen Dank für die ganzen Anregungen. Eure Tipps werde ich das nächste mal beachten.
Doch wann eine Simple Factory und wann eine Factory Method angebracht ist, habe ich erst durch From No Factory to Factory Method richtig verstanden.

Grüße

12.11.2015 - 16:23 Uhr

Schönen Mittag euch,

derzeit beschäftige ich mich intensiv mit Design Patterns.

Nun hat sich herausgestellt, dass viele Entwickler die "Simple Factory" mit der "Factory Method" verwechseln.

Hier mal kurz zwei Beispiele (Achtung, ich bin unkreativ 😛):

Meine "Entities"


public interface IFruit 
{
	Color Color { get; set; }
	double Weight { get; set; }
	void Eat();
}

public class Apple: IFruit 
{
	public Color Color { get; set; }
	public double Weight { get; set; }
	
	public Apple()
	{
		Color = Color.Red;
		Weigth = 125;
	}
	
	public void Eat()
	{
		//Implementation
	}
}

public class Banana: IFruit 
{
	public Color Color { get; set; }
	public double Weight { get; set; }
	
	public Apple()
	{
		Color = Color.Yellow;
		Weigth = 200;
	}
	
	public void Eat()
	{
		//Implementation
	}
}

Simple Factory


public class FruitFactory 
{
	public static IFruit Create(FruitType type)
	{
		switch(type)
		{
			case FruitType.Apple:
				return new Apple();
			case FruitType.Banana:
				return new Banana();
			default:
				return null;
		}
	}
}

Method Factory


public abstract class FruitFactory 
{
	public IFruit Create()
	{
		var fruit = CreateFruit();
		
		//Mache irgendwas mit dem Objekt, ist aber nicht zwingend...
		fruit.Eat();
		
		return fruit;
	}

	protected abstract IFruit CreateFruit();
}

public class AppleFactory: FruitFactory
{
	protected override IFruit CreateFruit()
	{
		return new Apple();
	}
}

public class BananaFactory: FruitFactory
{
	protected override IFruit CreateFruit()
	{
		return new Banana();
	}
}

So, nun zu meiner Frage:

Wo genau liegt denn der Vorteil bei der Factory Method. Laut meinen Recherchen wird die Factory Method ziemlich oft verwendet.
Für mich ist diese jedoch von der Benutzung her, aufwendiger als die Simple Factory.

Bei der Simple Factory übergebe ich einfach meinen Typ, habe mein konkretes Objekt, fertig.
Bei der Factory Method jedoch, muss ich erst eine konkrete Factory(Apple/Banana-Factory) einer Basis-Factory(Fruit Factory) zuweisen und kann nicht elegant mit einem Enum meine gewünschte konkrete Frucht bekommen.

Soweit ich das verstanden habe, gibt es folgende Vorteile der Factory Method:*Ich entkoppel die Klienten(Aufrufer der Factory) von einer konkreten Implementierung *Die Basis-Factory selbst kennt ebenfalls keine konkrete Typen *Ich kann neue Features hinzufügen, ohne bestehenden Quellcode zu verändern (Stichwort Open/Closed Principle, was meiner Meinung nach, die Simple Factory eben nicht kann)

04.11.2015 - 17:23 Uhr

Schönen Abend euch,

es gab einen kleineren Bug in unserem CSV-Parser. Es kann relativ schlecht mit Daten umgehen, sobald ein Record sich über mehrere Zeilen verteilt.
Das Problem habe ich gelöst, nur bin ich mir der Umsetzung nicht zufrieden. Für mich sieht es einfach "dirty" aus. Vlt. hat ein erfahrerener Programmierer einen besseren Ansatz, wäre jedenfalls sehr dankbar.

So, nun zur Erklärung, es gibt Folgendes (nur ein Beispiel):*TextBegrenzer (im Code = FieldBeginsWith & FieldEndsWith = " *FeldBegrenzer (im Code = FieldSeparators = |

Die Werte die mir mit TextSourceDescription übergeben worden, sind leider vorgegeben und können nicht geändert werden.

Ich muss jetzt folgende Fälle parsen können:


Fall1:
"ID"|"Name"
"0"|"Marcel"

-> Einzeiliger Record

Fall 2:
ID|Name
0|Marcel

-> Einzeiliger Record

Fall3:

"ID"|Name         <- (kann auch anders herum sein)
"0"|Marcel

-> Einzeilige Record

Fall4:

"ID"|"Name"
"0"|"Ein sehr
langer name"

-> Merhzeiliger Record

Fall5:

"ID"|"Name"
"0"|"Ein sehr
\"langer\" name"

-> Merhzeiliger Record

Das sind die Fälle die ich abdecken muss.

Was mein Algorithmus macht, ist einfach erklärt:
Ist das letzte Zeichen ein Textbegrenzer? - Wenn Nein, möglicher MultiLine-Record
Fängt das letzte Feld mit einem Feldbegrenzer und einem Textbegrenzer an? - Klare Sache, ist ein MutliLine-Record.

Hier mal der Code:


        private bool IsMultiLineColumn(string line, TextSourceDescription description)
        {
            var reversedLine = string.Join("", line.Reverse());
            var beginsWithFieldAndTextSeparator = false;

            //If the last character of the current row is a text separator, the record isn't multiline
            if (reversedLine.First() == description.FieldsEndWith)
            {
                return false;
            }

            for (var index = 0; index < line.Length; index++)
            {
                //Checks if the current record ends with a text separator
                if (reversedLine[index] != description.FieldsBeginWith)
                {
                    continue;
                }

                //If the current field is the first field of this record, we're not able to check, if the first character is a field separator, 
                //because the first field does not contains a field separator at the first position
                if (index >= reversedLine.Length)
                {
                    beginsWithFieldAndTextSeparator = true;
                }
                else
                {
                    //Checks if the field doesn't start with a text separator and a field separator
                    if (!description.FieldSeparators.Any(fieldSeparator => reversedLine.Length >= index + fieldSeparator.Length 
                        && reversedLine.IndexOf(fieldSeparator, StringComparison.InvariantCulture) == index + 1))
                    {
                        continue;
                    }

                    beginsWithFieldAndTextSeparator = true;
                    break;
                }
            }

            return beginsWithFieldAndTextSeparator;
        }

06.09.2015 - 18:11 Uhr

Wir haben leider keine Glaskugel.
Wenn Du nicht sagen willst, was genau null ist und was Zeile 93 ist, dann können wir Dich leider nur auf die NullReference-Seite des Forums verweisen, wie es MrSparkle gemacht hat.

Ich habe doch ganz genau gesagt, was die Zeile 93 ist? Ich selbst weiß nichteinmal was null ist, jede von mir erstelle Variable ist nicht null! Ich greife lediglich auf das DbSet zu, welches ebenfalls nicht null ist. Wie schon gesagt, die Exception kommt von Entity Framework, wie man es aus dem Stracktrace entnehmen kann.

Hiernochmal, dass ist die besagte Zeile 93:


        public virtual void Add(TEntity entity)
        {
            _entites.Add(entity);
        }

Diese hat der Moderator mr.sparkle aus mir nicht bekannten Gründen entfernt. Das ganze Konstrukt wir hier initalisiert:


      private readonly MysqlContext _context;
        private IDbSet<TEntity> _entites;

        public GenericRepository(MysqlContext context)
        {
            _context = context;
            _entites = _context.Set<TEntity>();
        }

Grüße

//Edit:
Scheinbar hatte die Version des Mysql-Providers welche ich nutze, ein Bug o.ä. Nach dem ich über Nuget die aktuelles assembly mir zog, lief alles ohne eine Exception durch. Trotzdem danke 😉

06.09.2015 - 17:14 Uhr


>


>

Ich verstehe aber nicht, warum das im Zusammenhang des Entity-Frameworks auftaucht.
Selbst wenn ich direkt auf das DbSet im DbContextx zugreife, welches nicht Null ist, bekomme ich diesen Fehler. Denn alle Variablen auf die ich zugreife sind nicht null, laut Stacktrace scheint der Fehler von dem EntityFramework zu kommen, nicht von meinem Code, deswegen frage ich um Lösung.

06.09.2015 - 16:14 Uhr

Das ganze wird im Konstruktor wie folgt initialisiert:


        private readonly MysqlContext _context;
        private IDbSet<TEntity> _entites;

        public GenericRepository(MysqlContext context)
        {
            _context = context;
            _entites = _context.Set<TEntity>();
        }

Die Klasse "MysqlContext" kann man sich oben, in meinem ersten Post ansehen.

Grüße

06.09.2015 - 15:49 Uhr

Was sagt Dein Debugger genau, was Null ist?

Sollte doch im Stacktrace drinne stehen, nämlich:


 bei MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection connection)

Jedoch, bekomme ich keine Fehlermeldung, wenn ich mittels:


 Database.Connection.Open();

die Verbindung öffne, im Log des Mysql-Servers kann ich auch erkennen, dass ich gerade mit der Datenbank mich verbunden habe.

06.09.2015 - 15:35 Uhr

Dein DbSet heisst Tests und nicht Test.

Auch das habe ich schon umbenannt, bekomme jedoch den gleichen Fehler.

06.09.2015 - 15:05 Uhr

Schönen Mittag euch,

ich versuche gerade, mittels dem Entity Framework mich auf meine Mysql-DB zu verbinden und ein paar Beispiel-Werte abzulegen.

Mit der Datenbank selbst kann ich mich mitlerweile verbinden. Sobald ich jedoch versuche, auf die DbSet-Property zuzugreifen, bekomme ich eine Null-Reference-Exception.

Hier mal ein Ausschnitt aus meiner App.config:


 <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  
  <connectionStrings>
    <add name="MysqlDefaultConnection" connectionString="server=localhost;user id=***;password=***;database=***" providerName="MySql.Data.MySqlClient" />
  </connectionStrings>
  
  <entityFramework>
    <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

Hier mein DbContext (zum Testen, habe ich auf die schnelle das Entity in der gleichen Datei implementiert):


 public class MysqlContext: DbContext
    {
        public DbSet<Test> Tests { get; set; }

        public MysqlContext(): base("MysqlDefaultConnection")
        {
            Database.Connection.Open();
        }
            
    }

    [Table("test")]
    public class Test
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
    }

Die Tabellen-Beschreibung sieht so aus:


CREATE TABLE `test` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(45) NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Mittels:


var context = new MysqlContext();
var testRepo = new GenericRepository<Test>(context);
testRepo.Add(new Test { Name = "Test" });

initialisiere ich die Datenbank und das Repository, welches auf das dazugehörige DbSet zugreift. Sobald ich hier jedoch versuche, das Entity hinzuzufügen, bekomme ich die besagte Exception:

Fehlermeldung:
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

bei MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection connection)
bei System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection)
bei System.Data.Entity.Utilities.DbProviderServicesExtensions.GetProviderManifestTokenChecked(DbProviderServices providerServices, DbConnection connection)
bei System.Data.Entity.Infrastructure.DefaultManifestTokenResolver.<>c__DisplayClass1.<ResolveManifestToken>b__0(Tuple3 k) bei System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key, Func2 valueFactory) bei System.Data.Entity.Infrastructure.DefaultManifestTokenResolver.ResolveManifestToken(DbConnection connection) bei System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest&amp; providerManifest) bei System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection) bei System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) bei System.Data.Entity.Internal.RetryLazy2.GetValue(TInput input)
bei System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
bei System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
bei System.Data.Entity.Internal.Linq.InternalSet1.Initialize() bei System.Data.Entity.Internal.Linq.InternalSet1.get_InternalContext()
bei System.Data.Entity.Internal.Linq.InternalSet1.ActOnSet(Action action, EntityState newState, Object entity, String methodName) bei System.Data.Entity.Internal.Linq.InternalSet1.Add(Object entity)
bei System.Data.Entity.DbSet1.Add(TEntity entity) bei **ProjectName**.DataAccess.Implementation.GenericRepository1.Add(TEntity entity) in C:\Users*DesktopUser*\Documents\Visual Studio 2015\Projects*ProjectName**ProjectName*.DataAccess.Implementation\GenericRepository.cs:Zeile 93.
bei ProjectName.Application.Program.RegisterDependencies(IDependencyResolver resovler) in C:\Users*DesktopUser*\Documents\Visual Studio 2015\Projects*ProjectName**ProjectName*.Application\Program.cs:Zeile 27.
bei ProjectName.Application.Program.Main(String[] args) in C:\Users*DesktopUser*\Documents\Visual Studio 2015\Projects*ProjectName**ProjectName*.Application\Program.cs:Zeile 15.
bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()

Hat jemand "auf die schnelle" eine Idee, was genau mein Fehler ist und was ich daran zuändern habe? Wäre euch sehr dankbar.

Grüße...

02.09.2015 - 16:02 Uhr

Okay, habe es selber gefunden...
Problem liegt daran, dass beide Seiten IFetchService selbst definieren, was natürlich ziemlich blöde ist, wenn einer der beiden Seiten beschließt eine Änderung an diesem Interface zu tätigen.
Habe jetzt dieses Interface in eine eigene Library verfrachtet und lasse dieses von beiden Seiten (Application und Plugin) referenzieren. Mein Plugin wird jetzt auch instanziiert.

Vielen Dank trotzdem 😉

02.09.2015 - 08:15 Uhr

Schönen morgen euch,

Ich habe mir ein wirklich simples Plugin-System gebastelt, mit diesem ich meine Anwendung minimal erweitern möchte, dass ganze realisieren ich mit Hilfe von MEF.

In meiner Klasse (Plugin-Manager) werden im Konstruktor alle vorhandenen Plugins geladen und instanziiert, jedenfalls sollten diese das...

Im AggregateCatalog kann ich genau erkennen, das ein Plugin geladen wurde und in der "Part"-Property enthalten ist. Sobald aber der CompositionContainer versucht, dieses Plugin zu laden, passiert genau nichts, meine Plugin-Liste bleibt leer. Selbst eine Fehlermeldung bekomme ich hier nicht.

Hier mal ein Auszug, meines Codes:

Der Plugin-Manager


  [ImportMany(typeof(IFetchService))]
    private IEnumerable<IFetchService> _pluginList;
    private AggregateCatalog _pluginCatalog;
    private const string pluginPathKey = "PluginPath";
    ...

    public PluginManager(ApplicationContext context)
    {
        var dirCatalog = new DirectoryCatalog(ConfigurationManager.AppSettings[pluginPathKey]);
        //Here's my plugin listed...
        _pluginCatalog = new AggregateCatalog(dirCatalog);

        var compositionContainer = new CompositionContainer(_pluginCatalog);
        compositionContainer.ComposeParts(this);
     }
     ...

Hier das eigentliche Plugin:


[Export(typeof(IFetchService))]
public class MySamplePlugin : IFetchService
{
    public MySamplePlugin()
    {
        Console.WriteLine("Plugin entered");
    }
    ...
}

Hat jemand eine Idee, was ich falsch mache?

Grüße

29.05.2015 - 16:08 Uhr

Was ich haben möchte, zumindest wie ich es mir Vorstelle ist folgendes:
Jedes Plugin stellt einen eigenen User dar. Jeder dieser User darf nur auf für ihn erlaubte Bereiche (Klassen) zugreifen.

Als Technologie verwende ich Asp.Net, jedenfalls den Web Api Teil. Die Schnittstellen werden über einen JS-Client aufgerufen. Die Plugins selbst stellen aber keine grafischen Erweiterungen dar, lediglich funktionelle. Dabei geht es konkret um dieses Situation:
Das ganze stellt einen Downloader dar. So, die Grundfunktion, nämlich das Downloaden ist implementiert. Nun möchte ein User ein Plugin erstellen, mit diesem gedownloadete Daten entpacket werden. Dieses Plugin stellt eine reine Funktion dar, keine Grafik. Um zu wissen, welche Daten das Plugin entpacken soll, muss dieses auf irgendwas wie einen Download-Manager zugreifen. Dieser Download-Manager wäre z.B eine solche Komponente bei dieser ich die Rechte definieren möchte. Ich als User will nicht, das bestimmte Plugins auf diesen Download-Manager zugreifen können. Prinzipiell hat aber jedes Plugin die Möglichkeit dazu, denn alle Abhängigkeiten werden über einen DI-Container aufgelöst.
Deswegen halte ich die Rechteverwaltung während dem auflösen von Komponenten im DI-Container am sinnvolsten.

Plugins werden von Anfang an geladen, da es für mich keinen Sinn macht, Plugins erst dann zu läden, wenn z.B.: ein bestimmtes Event aufgerufen wird. Zudem gibt es sicher auch Situationen, in diesen es sinnvoll ist, direkt am Programmstart bereit zu sein.

Grüße

29.05.2015 - 08:34 Uhr

Schönen Morgen euch,

icb benötige einen guten, aber vorallem sicheren Ansatz, mit diesem ich Rechte für einzelne Plugins setzen kann.

Das Pluginsystem habe ich schon auf Basis von MEF entwickelt. Plugins werden mittels einen Dependency Container mit einer "API" versorgt.
Nun habe ich mir überlegt, wie man am effektivsten dort eine Rechteverwaltung implementieren könnte.

Ich dachte mir, dass ich innerhalb des Dependency Containers, während dem Resolven folgende Dinge tuhe:

  • Nennen wir es mal "PermissionAttribute" aus der Klasse entnehmen, welche das Plugin gerne resolved haben möchte *Rechte des Plugins mittels einer PluginId aus einer Datenbank abhohlen *Vergleichen, ob die Rechte im Attribute mit den Rechten des Plugins übereinstimmen *Wenn Rechte korrekt sind, wird das Objekt zurück gegeben, ansonsten wirft der Container eine Exception o.ä

So in etwa würde ich mir das vorstellen. Einen kleinen Prototyp habe ich auch schon entwickelt, funktioniert auch, soweit ich das jedenfalls erkennen kann.
Meine eigentliche Frage ist, gibt es bessere Methoden, soetwas zu realisieren?

Grüße

27.05.2015 - 18:01 Uhr

Das Problem ist ja, dass ich in meinem oben genannten Beispiel schon den Regex als Instanz benutze.

Grüße

27.05.2015 - 17:59 Uhr

Versuch mal eine leere Soulution zu erstellen und dann ein neues Projekt hinzufügen.
Ansonsten VS Deinstallieren und neu Installieren.
Hatte das Problem auch mal andere hast sich bei mir von selbst erledigt.

Danke, hat leider beides nichts gebracht. Dann bleibt mir wohl garnichts anderes übrig, als das ganze neu zu installieren.

Trotzdem danke an alle.

//Edit: Habe das ganze mehrmals neu installiert, mit diversen Versionen (2013) variiert, aber jedes mal bekomme ich diesen Fehler.

Grüße

27.05.2015 - 15:15 Uhr

Schönen Nachmittage euch,

zurzeit versuche ich herauszufinden, wie man Regex-Abfragen über mehrere Threads optimieren könnte. Alle Pattern werden dynamisch zur Laufzeit generiert. Dabei greifen mehrere Threads auf diese Regeln zu. Mir ist dabei aufgefallen, das die Performance in mehreren Threads sinkt.

Folgende Werte habe ich bei einer Analyse herausbekommen:


(Maximale Zeiten von ForEach/ParallelForeach 100000 Werten)

Regex in mehreren Threads:
Insanzieren eines Regex-Objekts: 125ms
Match einer Regel: 130ms
Kompletter Durchgang (Instanz + Match): 170ms
-----------------------------------------------------------------

Regex in einem Thread :
Insanzieren eines Regex-Objekts: 20ms
Match einer Regel: 26ms
Kompletter Durchgang (Instanz + Match): 26ms

Daraufhin habe ich mir mal die Regex-Klassen genauer angeschaut. Laut meiner Interpretation sperrt die Regex-Klasse andere Threads, sobald sie mit ihrer Cache interagiert.
Gibt es eine Möglichkeit, diesen Cache zu deaktivieren?

Gibt es eventuell andere Möglichkeiten, wie eine andere Regex-Engine?

Grüße

26.05.2015 - 21:42 Uhr

VS Updates installieren.

Ist aktuell mit Update 5

Grüße

26.05.2015 - 20:17 Uhr

Schönen Abend euch,

sobald ich versuche ein leeres Asp.Net Projekt zu erstellen, bekomme ich immer einen Laufzeitfehler:

Fehlermeldung:
Ein Aufrufziel hat einen Ausnahmefehler verursacht.

Diese Meldung bekomme ich beim Anlegen eines leeren Projektes, egal ob ich Web Api, oder MVC auswähle. In beiden Fällen ist meine Projektmappe unvollständig und es fehlen relevante Klassen, bzw. Dateien.
Sobald ich aber ein Projekt mir erstelle, welches bereits eine Beispielanwendung beinhaltet, bekomme ich diesen Fehler nicht, auch die Projektmappe ist vollständig.

Versucht habe ich es schon mit einer Reparatur über den Installer, hat leider nichts geholfen.

Hat jemand eine Idee, was ich noch machen könnte (ausgenommen einer neu installation)?

Grüße

04.05.2015 - 14:14 Uhr

Schönen Mittag euch,

nun ich frage mich, was ein guter .Net Entwickler alles können muss, um sich behaupten zu können.
Wenn ich aktuelle Stellenangebote durchlese und meine Erfahrung (sehr wenig, da Azubi) zusammenfasse, komme ich auf folgende Punkte:

  • sehr gute C# oder VB Kenntnisse
  • linq, lambda, reflection etc
  • Patterns, Best Practices, Guidlines, Architektur, Software Design
  • ASP.Net, Angular, evtl. Typescript, evtl. Azure
  • Umgang mit VS und oft genutze Plugins (resharper, dotcover, nuget, etc.)
  • WinForms und WPF
  • Projektplanung

Das ist so das grobe, was mir auf die schnelle Einfällt. Gibt es von eurer Seite sonst noch etwas, was evtl. hilfreich sein könnte, als erfolgreicher .Net Entwickler?

Grüße

13.04.2015 - 17:21 Uhr

Directory-Einträge fangen mit d an 😉, z.B.

drw-rw-rw- ...

Wenn du z.B. durch die lines steppst und if (line.StartsWith("d")) abfragst, kannst du die Directories heraus filtern.

Danke, ist mir vorhin auch aufgefallen. Hier mal der Code, funktioniert für mich soweit:


        /// <summary>
        /// Parsing a chmod based string into a <see cref="FtpFileItemEntity"/>
        /// </summary>
        /// <param name="line">Line to parse</param>
        /// <returns>Returns a <see cref="FtpFileItemEntity"/></returns>
        private FtpFileItemEntity ParseChmodString(string line)
        {
            var result = new FtpFileItemEntity();
            var items = line.Split(new [] {" "}, StringSplitOptions.RemoveEmptyEntries);

             //Based on this string: "drwxr-xr-x 1 ftp ftp 0 Apr 13 13:02 testFolder"
             //The first character says, that the item is a file or a directory. 
             //If the first character is "d" it is a directory, in case of the character "-" it is a file.
            result.IsFile = !items[0].StartsWith("d");

            long size;
            //The third item contains the file size
            if (long.TryParse(items[4], out size))
            {
                result.Filesize = size;
            }

            //The eighth item contains the name of the specfic file
            result.Filename = items[8];

            return result;
        }

13.04.2015 - 15:57 Uhr

Schöen Mittag euch,

für ein Webinterface benötige ich einen Service mit diesem es möglich ist, durch einen FTP-Server zu navigieren. Dies stellt ansich kein Problem dar. Doch wie kann ich unterscheiden, ob es sich um eine Datei oder einen Ordner handelt?


        public IEnumerable<string> GetAllFiles(FtpConnectionEntity settings)
        {
            var request = (FtpWebRequest) WebRequest.Create(settings.FileUri);
            request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

            if (!string.IsNullOrEmpty(settings.Username))
            {
                request.Credentials = new NetworkCredential(settings.Username, settings.Password);
            }

            using (var response = (FtpWebResponse)request.GetResponse())
            {

                using (var streamReader = new StreamReader(response.GetResponseStream()))
                {
                    return streamReader.ReadToEnd().Split(new [] {"\r\n"}, StringSplitOptions.RemoveEmptyEntries);
                }
            }
        }

Hiermit bekomme ich alle Ordner und Dateien aufgelistet schön und gut, doch was ist jetzt was? Es kann ja vorkommen, dass Ordner einen Punkt beinhalten und somit als Datei behandelt werden, sobald ich auf eine Extensions überprüfe.

Wäre nett, wenn mir jemand mal kurz einen Denkanstoß geben könnte 😉

//Edit: Eine Möglichkeit wäre, die Dateigröße abzufragen, kommt es zu einer Exception handelt es sich um einen Ordner. Dies finde ich aber sehr unsauber und möchte ich eher nicht in meinem Code stehe haben.

08.04.2015 - 09:59 Uhr

Okay, ich danke dir. Dass Exception-Handling fehlt ist mir klar, wollte nur auf das wesentliche eingehen.

Das Thema mit "Task.Run()" innerhalb einer Bibliothek meine ich, irgendwo mal auf Stackoverflow aufgeschnappt zu haben, werde mal schauen, ob ich das noch einmal finde.

Grüße Marcel

08.04.2015 - 09:22 Uhr

Schönen Morgen euch,

eigentlich habe ich gedacht, dass ich das Prinzip von **async **und await verstanden habe, jedoch stoße ich immer wieder auf Blogs, die mir das Gegenteil behaupten. Nun brauche ich einen Rat.

Nehmen wir an, ich habe eine Methode, welche einen langen Prozess abarbeitet. Diese Methode nennen wir mal "DoWork()". Dieses Methode implementiert nicht async oder ähnliches. Ist es sinnvoll für diese Methode jetzt einen asynchronen Wrapper zu basteln, also so etwas wie:


public async Task DoWorkAsync()
{
    await Task.Run(()=> DoWork());
}

Wenn ich diese Methode aufrufe, wird ja nur die Methode "DoWork" in einem anderen Task ausgehürt, meiner Meinung nach, ist das eher parallel anstatt asynchron. So nach dem Motto: "Aus den Augen, aus dem Sinn".

Ist so etwas legitim, oder völliger Quatsch? Ich habe zudem mehrmals gelesen, dass man es möglichst vermeiden sollte, in einer Klassenbibliothek "Task.Run" zu benutzen, warum? Wie sonst, sollte ich dann diesen Wrapper implementieren?

Wie implementiert ihr asynchrone Funktionsaufrufe von "eigenen" Funktionen?

22.03.2015 - 12:49 Uhr

Schönen Mittag euch,

ich haben eine App bestehend aus einem Client und einem Server entwickelt. Nun möchte ich das ganze testen. Es sollen automatisiert mehrere Client auf den Server sich verbinden und dabei unterschiedliche Dinge tun. Damit möchte ich testen, ob der Server in der Lage ist, performant mehrere Clients gleichzeitig zu bedienen. Wie könnte ich sowas am besten umsetzen?
Meine Integration-Tests testen teilweise schon auf mehreren Threads, jedoch möchte ich gerne reale Umstände haben. Heißt: Client soll sich anmelden und darauf irgendeine Aktion durchführen, dies soll am besten mehrmals gleichzeitig mit mehreren Client geschehen.
Dies soll am besten in einer VM geschehen, auf dieser ich irgendein Script installiere, welche das ganze ausführt. Gibt es da schon eine Fertig-Lösung?

Grüße Marcel

11.03.2015 - 13:18 Uhr

Okay, die Slahses werde ich heute Abend mal ändern.

Setz doch einfach eine Referenz auf die Exe und stell die Build-Eigenschaften auf "Copy always".

Was genau meinst du damit, könntest du das mal kurz erklären?

Grüße Marcel

11.03.2015 - 11:39 Uhr

Schönen guten Morgen euch,

ich versuche derzeit ein Post-Build-Ereignis zu einzurichten.
Habe es jetzt auch geschafft, zu kompilieren, ohne einen Fehler zu bekommen.
Jedoch wird meine Quelldatei nicht in das gewünschte Verzeichnis koppiert. Laut dem Log von VS wird diese auch nicht koppiert, 0 Dateien koppiert bekomme ich als Ausgabe. Verstehe aber nicht ganz wo das Problem ist.

Folgende Dinge möchte ich erreichen:

  1. Ausgabe-Ordner in einem übergeordneten Ordner (2 Level zurück) namens Build einrichten. Das klappt auch ganz gut.
  2. Mittels XCopy die kompilierte Anwendung von build nach bin koppieren und umbenennen. Der bin-Ordner ist im gleichen Leven wie das Build-Verzeichnis.

Mein Build-Ordner navigiere ich hiermit an:

$(SolutionDir)../../build/$(ProjectName)

Die Datei versuche ich mittels diesen Befehlen zu koppieren:

xcopy "$(SolutionDir)../../build/$(ProjectName)/$(TargetFileName)" "$(SolutionDir)../../bin/AutoCopy-Server.exe*"

Hier mal die Ausgabe des Compilers:


1>------ Erstellen gestartet: Projekt: AutoCopy.Application, Konfiguration: Debug Win32 ------
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets(357,5): warning MSB8004: Output Directory does not end with a trailing slash.  This build instance will add the slash as it is required to allow proper evaluation of the Output Directory.
1>  AutoCopy.Application.vcxproj -> C:\Users\****\Desktop\AutoCopy\src\Server\../../build/AutoCopy.Application\AutoCopy.Application.exe
1>  0 Datei(en) kopiert
\========== Erstellen: 1 erfolgreich, 0 fehlerhaft, 0 aktuell, 0 übersprungen ==========


Hat jemand eine Idee, was mein Fehler sein könnte?

Grüße Marcel

18.12.2014 - 08:50 Uhr

Dann funktioniert es. Problem, wir möchten gerne unsere Testabdeckung wissen, bzw. sehen, welche Methoden noch nicht abgedeckt wurden.

17.12.2014 - 17:23 Uhr

Schönen Abend euch,

derzeit habe ich ein ziemlich komisches Problem.
Ich habe ca. 300 Unit-Tests, wenn ich diese versuche zu durchlaufen bekomme ich kein
Problem. Wenn ich jetzt jedoch eine Analyse mit DotCover mache, kommt es zu einer > Fehlermeldung:

StackOverflow-Exception

Die Task Runnger Application von ReSharper stürtz ab, mit der Fehlermeldung:> Fehlermeldung:

"Task Runner Application funktioniert nicht mehr" Ereignisname: "APPCRASH".

Versuche ich dies zu debuggen, sehe, ich das in dieser CodeStelle eine StackOverflowException entsteht:


 public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
        {
            IMethodReturn next = null;
            
            _interceptor.Process(input.Target, input.MethodBase, () =>
            {
                if (getNext == null) return;
                
//hier wird auf die Exception verwiesen
                next = getNext()(input, getNext);

                if (next != null && next.Exception != null)
                {
                    throw next.Exception;
                }
            });

            return next;
        }

Dies ist eigentlich nur eine Implementierung eines InterceptionBehavior aus der Enterprise Library.

Das wirklich komische aber ist, es liegt nicht an einem spezifischen Test. Wenn ich den Test deaktivieren, an diesem der DotCover abstürzt, schlägt er bei einem anderen Test fehl.
Das sind auch wirklich alle informationen die ich bekommen habe, es wird mir ja nicht einmal angezeigt, an welchem Test er hängen bleibt. Ich habe aber gemerkt, dass das Durchlaufen eines Tests, immer länger dauert, bis er eben endgültig abschmirt.

Hat jemand eine Idee?

14.12.2014 - 21:08 Uhr

Das ist doch exakt das Handling, dass das NuGet-Paket 'CommandLineParser' auch inne hat, oder ist der Name nur ungluecklich gewaehlt, oder ist es ein Fork?

Das ist mir bisher noch nicht aufgefallen, dann ist der Name einfach nur unglücklich gewählt worden.

14.12.2014 - 20:50 Uhr

Beschreibung:

Mit diesem CommandLineParser ist es möglich übergeben Argumente zu parsen und in eine entsprechende Entity-Klasse exportieren zulassen, damit das Zugreifen der übergeben Argumente möglichst einfach gestaltet werden kann.

Das Format bzw. die Syntax der Argumente können selbstverständlich selbst definiert werden. Somit ist dieser Parser auch einfach abänderbar, ohne die Assembly neu zu kompilieren

** Download **

Die Assembly sowie ein entsprechendes Test-Projekt habe ich hier mal verknüpft.
Jeder kann damit machten was er will, dies ist einem komplett selbst überlassen.

Worauf ich mich jedoch freuen würde, wären Verbesserungsvorschläge, da ich noch nie eine Assembly entworfen habe, die für mehr bestimmt war, als bei mir zuhause genutzt zu werden.

Meine ProjektMappe ist als RAR im Anhang hinterlegt.

Nutzung

Die Nutzung ist im Prinzib ziemlich einfach gehalten.
Als Grundlage nehmen wir folgende Argumente:


--Address="Eine kleine Straße" --Name=MeinName  --Long=NotBad -i=42 -U -c=meineCompany

Hierbei gibt es folgende Features:*Ausgeschriebene Parameter (werden eingeleitet mit '--') *Kurzgeschriebene Parameter (werden eingeleitet mit '-') *Mehrere Typen sind erlaubt (string, int, bool, weitere folgend noch...) *Über Attribute lassen sich Felder benutzerdefiniert einstellen *Attribute werden automatisch in eine entsprechende Entity gemappt. *Abrufen von HilfeTexten, welche für jede Property gesetzt werden können.

** - Entity**

Hier möchte ich kurz erklären, wie eine solche Entity aussehen kann.


public class Option
    {
        [Command(Help="SomeHelp")]
        public string Adress { get; set; }

        [Command(Required=true)]
        public string Name { get; set; }

        [Command(Name="Long", Help="SomeMoreHelp")]
        public string AVeryVeryVeryLongProperty { get; set; }

        [Command(ShortName="i")]
        public int Id { get; set; }

        [Command]
        public bool UseSomeThing { get; set; }

        [Command(Name="Company", ShortName="c", Required=true)]
        public string Company { get; set; }
    }

Insgesammt gibt es 4 Möglichkeiten eine Property zu definieren:
*Name: Hier kann man den Namen der Option definieren. Beispiel: --Name In diesem Fall wäre 'Name' der Name der jeweiligen Option. Ist dieser Wert nicht gesetzt, so wird automatisch der Name der Property benutzt. *ShortName: Hier kann man den Kürzel (Kurzschreibweiße) einer Option definieren. Beispiel: -N In diesem Fall wäre 'N' die Kurzschreibform. Ist auch dieser Wert nicht gesetzt, so wird das erste Zeichen des Property-Namen benutzt. *Help: Dies ist die Beschreibung zu der jeweiligen Option. Falls der User diese einfordern möchte. *Required: Setzt man dies, möchte man erzwingen, dass eine entsprechende Option gesetzt werden muss. Trifft dies nicht zu, führt dies zu einer Exception.

** - Syntax defination **

Selbstverständlich können die entsprechenden Separatoren frei definiert werden.
Hier ein kleines Beispiel wie man eine eigene Syntax definieren kann:


var parser = new CommandParser(true);
parser.RegisterSyntax(SyntaxType.ShortOptionInitiator, "-");
parser.RegisterSyntax(SyntaxType.OptionInitiator, "--");
parser.RegisterSyntax(SyntaxType.ValueSeparator, "=");

Standardmäßig werden die oben gennanten Beispiele schon im Konstruktor definiert.

** - Help **

Bei Fehleingaben oder sonstigen Problemen hat man die Möglichkeit, den Nutzern eine entsprechende Hilfe zu den Optionen anzeigen zulassen.


var result = Help.GetHelp<Option>();

Hier wird ein Dictionary zurück gegeben, als Key wird der PropertyName verwendet, als Value der entsprechende Hilfe-Text welchen man über die Attribute vergeben hat.

** - Parsen **

Hier mal ein komplettes Beispiel, wie man diesen Parser benutzt:


var parser = new CommandParser(true);

var resultList = parser.Parse(args);

var mapper = new CommandMapper();
var entity = mapper.Mapp<Option>(resultList);

Schlagwörter: <Bitte Schlagwörter, unter denen dein Snippet über die Suche gefunden werden soll, hier eintragen>

04.09.2014 - 07:00 Uhr

Gut Folgende Regeln sind definiert:
Eine Spalte wir immer mit einem Semikolon abgegrenzt.
Danach folgt der Text, dieser steht in "", da man nicht sicherstellen kann,
ob im Text auch ein Semikolon vorhanden ist.

Folgende Beispiele:
"Text1"; -> Text1
"Text1;Text2"; -> Text1;Text2
"Text1"T"ext2"; -> Text1"T"ext2

Das heißt, dass ich mir das erste " suchen muss, danach zum letzen Semikolon und überprüfen, ob eine Stelle davor ein " steht, ansonsten -> Formaterror (außer der letze Block, dieser besitzt kein ;, da überprüfe ich einfach das letzte Zeichen.

So nur zur Praxis, wie kann ich Strings "durch wandern" und nach Zeichen und deren Index abfragen? (Würde zwar mit nem char[] geheh, finde ich aber umständlich! oder kann man das so machen?)

03.09.2014 - 21:48 Uhr

Kann man leider nicht wissen, ob die Trennzeichen richtig gesetzt sind.

Der Sinn vom "" ist, das in diesem Text steht, welcher auch Sonderzeichen beinhalten kann wie z.b ;. Damit kann ich unterscheiden ob das ; nur Text ist, oder eine Trennung darstellt.

03.09.2014 - 20:34 Uhr

Das ganze ist geschäftlich und darf leider auf keine "externen" Bibliotheken benutzen.

Edit: Guter Tipp, dass ich den String bei ";" splitten kann, ist mir vollkommen entgangen

05.08.2014 - 13:26 Uhr

Viel langeweile ist auf jedenfall vorhanden 😉
Gut, dann bedanke ich mich mal.

Lg marcel

05.08.2014 - 00:07 Uhr

Schönen guten Abend euch,

derzeit arbeite ich an einer Client/Server Lösung.
Der Server überträgt dem Client Daten aus einer Mysql Datenbank, evtl. auch Dateien.
Meine Frage ist jetzt, wie würde dafür ein relativ sauberes Protokoll aussehe?

Ich habe es mir so gedacht:
Der Client bekommt immer mindestens ein Paket zugeschickt, das wie folgt aussieht:

ID#Type#MaxCountPackets#CurrentCountPackets#Data

ID: die ID des Paketes (Die ID ist in jedem "Subpaket" gleich)
Type: sagt dem Client, ob es sich um eine Datei, um einen String o.ä handelt
MaxCountPackets: Wie viele Subpakete es gibt, falls Data größer als 4096 Byte ist
CurrentCountPackets: sagt um welches SubPaket es sich handelt
Data: kann alles mögliche sein (String, Logindaten, Bilder...)

Dieser String wird dann immer mit einer Raute gesplittet.
Wenn Data größer als 4096 Byte ist, wird ein zweites Paket hinterher geschickt.

Frage 1: Ist dies eine akzeptable Möglichkeit, um eine Cient/Server Kommunikation aufzubauen?

Frage 2: Kann ich dann einfach die komplette Nachricht am TCP Client entgegennehmen? Das heißt, dass ich keinen Buffer dazwischen schalten muss, da der Buffer eigentlich schon in der Nachricht enthalten ist.

Frage 3: Ist der Buffer, bzw. die maximale Länge pro Paket von Data zu groß?

14.06.2014 - 21:51 Uhr

Hey,

hab dir mal ne Pn geschrieben.

Lg marcel

04.06.2014 - 20:43 Uhr

Die DataTemplates von ItemControls musst du nicht nochmal in Item-Elemente verpacken. Lass also beim Template das ListBoxItem weg, dann müsste es eigentlich klappen.

Oh stimmt danke, voll übersehen, war ein Denkfehler, jetzt geht alles wie es 'gehen' sollte, vielen Dank.

Lg marcel

04.06.2014 - 20:19 Uhr

Guten Abend lieber C#ler,

mir ist gerade aufgefallen, dass ich Items, diese sich in einer Listbox befinden gar nicht selektieren/auswählen kann, wo liegt das Problem?

Hier mal der XAML Code:


<ListBox DockPanel.Dock="Bottom" Margin="5" ItemsSource="{Binding Path=listBoxViewModel.DateList}" HorizontalContentAlignment="Stretch">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <ListBoxItem Padding="5" HorizontalContentAlignment="Stretch">
                                <Border CornerRadius="10" Background="LightBlue">
                                    <DockPanel LastChildFill="True">
                                        <Image Margin="5" Width="32" Height="32" DockPanel.Dock="Left" Source="{Binding Path=Image}" />
                                        <Separator DockPanel.Dock="Left" Margin="0,5,5,5">
                                            <Separator.LayoutTransform>
                                                <RotateTransform Angle="90" />
                                            </Separator.LayoutTransform>
                                        </Separator>
                                        <Grid DockPanel.Dock="Right">
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition  Width="2*"/>
                                                <ColumnDefinition />
                                                <ColumnDefinition Width="1.5*"/>
                                            </Grid.ColumnDefinitions>
                                            <TextBlock FontSize="13" FontWeight="Bold" Foreground="White" VerticalAlignment="Center" Grid.Column="0" Text="{Binding Path=Title}"/>
                                            <TextBlock FontSize="13" FontWeight="Bold" Foreground="White" VerticalAlignment="Center" Grid.Column="1" Text="{Binding Path=Priority}"/>
                                            <TextBlock FontSize="13" FontWeight="Bold" Foreground="White" VerticalAlignment="Center" Grid.Column="2" Text="{Binding Path=Date}" />
                                        </Grid>
                                    </DockPanel>
                                </Border>
                            </ListBoxItem>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

27.05.2014 - 09:12 Uhr

Okay danke schön.

Gruß repac3r

27.05.2014 - 08:01 Uhr

Okay wie darf ich mir das vorstellen?

Ich habe ein MainViewModel welches an den Datacontext der kompletten Gui(View) gebunden ist.
Meiner Meinung nach wäre es ja ein bisschen unübersichtlich, wenn ich in diesem MainViewModel die kompletten Binding Elemente implementiere. Deshalb wie schon gesagt möchte ich das ganze in SubViewModel unterteilen. Das MainViewModel kennt diese ganzen SubViews, aber wie implementiere ich die? Hier mal mein Ansatz:


//mainview.cs
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            MainViewModel viewmodel = new MainViewModel();

            this.DataContext = viewmodel.ViewModelList; //SubViewModels
            
        }
    }

//mainviewmodel
public class MainViewModel : BaseViewModel
{
	public List<BaseViewModel> ViewModelList;
	
	public MainViewModel()
	{
		ViewModelList = new List<BaseViewModel>;
		
		ListBoxViewModel listboxviewmodel = new ListBoxViewModel();
		ControlBarViewModel controlbarviewmodel = new ControlBarViewModel();
		
		//communicate between the ViewModels with Events ... (ICommand Refresh -> ListBox Refresh)
		
		ViewModelList.Add(listboxviewmodel);
		ViewModelList.Add(controlbarviewmodel);
	}
}

//Subviewmodel
public class ListBoxViewModel : BaseViewModel //example name
{
	//example class
	//manage the Listbox
}

//Subviewmodel
public class ControlBarViewModel : BaseViewModel //example name
{
	//example class
	//manage the ControlBar
}

Das ganze ist nur ein exemplarischer Code, aber wäre dieser Ansatz MVVM Komform?

26.05.2014 - 22:15 Uhr

Ich hätte da noch eine Frage und zwar wenn ich eine Gui habe mit mehreren Elementen die ich an einen Viewmodel binden möchte wie muss ich das machen? Folgendes Szenarion:
Ein paar Buttons (Controll Panel)
eine Listbox
eine Statusbar...

all diese Dinge möchte einen Viewmodel zuweißen, was jetzt kein Problem mehr ist. Mir ist nur unklar wie ich das am besten machen? Mehrere Viewmodel Klasse einzelnd den Sectoren(Controlpanel, Listbox, etc) zuweißen und die Viewmodel untereinander mit Events kommunizieren lassen, oder einen einzigen Viewmodel der den kompletten Datacontext der Gui zugewießen wird und andere Viewmodel kapselt (weiß nocht nicht wie ich das anstellen soll, evtl mit einer Liste)?

Hat da jemand ne Idee?

26.05.2014 - 15:07 Uhr

Das kann auch gar nicht funktionieren, da du offensichtlich den DataContext nur einem Label zuweist. Wenn das komplette Window diesen DataContext bekommt, sollte es funktionieren. Das hättest du aber auch selber rausfinden können, dazu gibt es Tools wie den WPF Inspector oder Snoop.

Oh danke, dass war das Problem (die Label ist ne Listbox).

lg repac3r

26.05.2014 - 13:40 Uhr

Ich habe den DataContext in der MainWindow Klasse deklaniert.


 public MainWindow()
        {
            InitializeComponent();
            this.lb_dates.DataContext = new viewmodel.MysqlDateViewModel(new model.MysqlDateModel());
        }

Sollte eigentlich auch klappen, denn ich bekomme auch beim Start der Anwendung Daten von einer Datenbank.

25.05.2014 - 15:28 Uhr

Jetzt habe ich ein ganz anderes Problem, es scheint so, dass das Binding von Commands gerade nicht funktioniert. Im View (MainWindow.xml) binde ich ein Command zu einem Button so:

<Button x:Name="bt_refresh" Command="{Binding Path=ReloadCmd}" Margin="5,10,5,5" Grid.Row="0" Content="Neu Laden"/>

Im ViewModel habe ich das Command so eingerichtet:


private ICommand _reloadCmd;

public MysqlDateViewModel(model.IMysqlDateProvider mysqlModel)
        {
           //diverse Zuordnungen...
            _reloadCmd = new DelegateCommand((param) => MysqlReload()); // Icommand einer Funktion "zuordnen"
        }

public ICommand ReloadCmd //öffentlicher Icommand für die View
        {
            get { return _reloadCmd; }
        }

private void MysqlReload() //nach klicken des Buttons, sollte eigentlich diese Funktion aufgerufen werden
        {
            System.Windows.MessageBox.Show("", ""); // wird nicht aufgerufen
        }

Ich weiß absoult nicht was ich faslch gemacht habe, gestern noch hat es funktioniert, kann mir jemand nen Tipp geben?

25.05.2014 - 12:49 Uhr

Entweder Du bindest das SelectedItem der ListBox an eine entsprechende Property des Viewmodels oder Du übergibts das SelectedItem als Parameter an das Command.

Okay dann werden wohl das selected item der Lostbox binden, denn ich weiß nicht wirklich wie ich das mit den Command Parameter mache, danke für die Hilfe.

25.05.2014 - 11:02 Uhr

Okay aber ich brauche immer noch den aktuellen ausgewählten ikeexxceiner listbox. Wie komm ich zu denn? Das Viewmodel kennt das View ja nicht, nur das View kennt das Viewmodel. Ich kann ja nicht vom Viewmodel auf einzelne Elemente der GUI zugreifen?

25.05.2014 - 01:01 Uhr

Hallo,

ich versuche mich gerade mit MVVM, jetzt ist mein Problem, das ich ein Command gebunden habe, ich aber nicht weiß, wie ich zu dem Rückgabewert komme.

Für Meine Commands benutze ich diese Klasse:


 public class DelegateCommand : ICommand
    {
        private readonly Action<object> _executeDelegate;
        private readonly Func<object, bool> _canExecuteDelegate;

        public DelegateCommand(Action<object> executeDelegate) : this(executeDelegate, null) { }
        public DelegateCommand(Action<object> executeDelegate, Func<object, bool> canExecuteDelegate)
        {
            this._executeDelegate = executeDelegate;
            this._canExecuteDelegate = canExecuteDelegate;
        }

        public void Execute(object parameter)
        {
            _executeDelegate(parameter);
        }

        public bool CanExecute(object parameter)
        {
            return _canExecuteDelegate == null ? true : _canExecuteDelegate(parameter);
        }

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
    }

Gebunden habe ich das Command auf einen Button, dieser den Index dessen aktuell ausgewählten Items einer Listbox Übergibt:


 <Button x:Name="bt_remove" Command="{Binding Path=CmdRemove}" CommandParameter="{Binding ElementName=lb_dates, Path=SelectedIndex}" Margin="5,10,5,5" Grid.Row="3" Height="Auto">Entfernen</Button>

Beim Viewmodel versuche ich das Command so zu empfangen:
(hier fehlt die Implementierung der Übergabeparameter, da ich kein Plan habe, wie ich das anstellen könnte)


_cmdReload = new DelegateCommand((param) => this.mysqlReload());
_cmdRemove = new DelegateCommand((param) => this.mysqlRemove());

Hier sind die Funktionen für die beiden Commands:


private void mysqlReload()
        {
            Msg = "";
            try
            {
                _mysqlModel.Reload();
                Msg = "reload successfouly";
            }
            catch (Exception ex)
            {
                Msg = ex.Message;
            }
        }

private void mysqlRemove()
        {
            MessageBox.Show("test", "successfouly");
        }

Die Funktion mysqlReload wird erfolgreich aufgerufen und bis zum model alles richtig aus der Datenbank gelesen -> keine Probleme.
Jedoch wird die Funktion remove garnicht erst aufgerufen, liegt es eventuell darin, dass die Implementierung der Übergabeparameter im ICommand fehlt?

19.05.2014 - 21:07 Uhr

Ich stehe vor dem Problem, dass ich mithilfe eines Thread Daten "sammle" und diese dann mit einem Events an eine andere Klasse weiter schicke. Jedoch kommt dann die Exception, dass ich auf dieses Objekt nicht zugreifen kann, da es im Besitz eines anderes Thread ist.

Ich habe mich schon hier im Forum durch gewühlt und dort waren die Lösungsvorschläge alle in Richtung Dispatcher/Invoke, Problem ich möchte ja nicht auf ein Steuerelement zugreifen, sondern auf ein Objekt (List<>). Kann mir da jemand weiter helfen?

Thread Funktion:


//Itemlist
private List<ListBoxDataContext> itemList = new List<ListBoxDataContext>();

private void thread_fetchData()
        {
            MySqlCommand command = new MySqlCommand("SELECT * FROM termine ORDER BY ID", connection);

            try
            {
                using (MySqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        ListBoxDataContext data = new ListBoxDataContext(reader.GetInt32("ID"), reader.GetString("Title"), reader.GetString("Priority"), reader.GetString("Date"));
                        itemList.Add(data);
                    }
                    reader.Close();
                }

            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.ToString(), "Fehler");
            }

            this.FechtingData();
            
        }

Event:


public delegate void OnFetchingDataEventHandler(List<ListBoxDataContext> itemlist);
public event OnFetchingDataEventHandler OnFetchingData;

 protected void FechtingData()
        {
            if (OnFetchingData != null)
            {
                OnFetchingData(itemList);
            }
        }


Hier wird das Event empfangen und "ausgewertet" (in einer anderen Klasse (WPF))


 void mysql_connection_OnFetchingData(List<ListBoxDataContext> itemlist)
        {
            string compareString1 = "";
            string compareString2 = "";

            foreach (ListBoxDataContext temp in itemlist) 
                compareString1 += temp.ToString();

            foreach (ListBoxDataContext temp in ItemList)
                compareString2 += temp.ToString();

            if (compareString1 != compareString2) //überprüfen, ob sich daten geändert haben (vorläufig)
            {
                ItemList = itemlist;
                ListBox.ItemsSource = ItemList;
     
            }

            

        }

Wie könnte ich das am besten sinvoll lösen, das ich das Objekt (itemList) übergeben kann?