Erledigt, eine Drittanbieter DLL, welche von einem Projekt expliziert mitgeliefert wird, stand auf "Copy Always". Anscheinend wurde eine andere Version bereits mitgeliefert, sodass dies zu Konflikten geführt hat.
"Copy if newer" hat jedenfalls geholfen. Nun mal noch schauen welche Versionskonflikte dort auftreten.
ich habe eine ASP.NET Core Applikation. Diese habe ich bisher über WebDeploy bereitgestellt (VS2017). Dies schlägt nun seit Freitag plötzlich aus mir nicht erkennbaren Gründen fehl.
Fehler
4>------ Publish started: Project: .........., Configuration: Debug Any CPU ------
Alle Buildübermittlungen in einem Build müssen Projektinstanzen aus derselben Projektsammlung verwenden.
4>Publish failed due to build errors. Check the error list for more details.
========== Build: 3 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========
========== Publish: 0 succeeded, 1 failed, 0 skipped ==========
Probiert habe ich:
- Clean / Rebuild
- Löschen von bin und obj
- Output verbosity mit Diagnostic hat mir auch keine weiteren Infos geliefert
- WebDeploy Package anstelle von WebDeploy
Lokal kann ich die Applikation problemlos builden und auch starten. Eine andere ASP.NET Core Applikation lässt sich problemlos deployen.
DictionaryEntry ist eben so definiert, dass Key und Value vom Typ object sind.
Du kannst also entsprechend casten oder du nutzt einen geeigneteren Parametertypen wie z.B. KeyValuePair<string, Point[]> und statt der Hashtable ein Dictionary<string,Point[]>
Jede Spalte/Zeile/Zelle hat eine Visibility (?) Eigenschaft. Dort kannst Du eine Expression einfügen, welche entsprechend das Feld ein-oder ausblendet.
Nun du musst also
1. deine Daten sammeln
2. nach der Auftragsnummer gruppieren
3. die Daten jeder Gruppe ausgeben
4. zwischen jeder Gruppe einen Zeilenumbruch erzeugen
Das war ja auch ein Projekt, welches auf dem vorherigen aufsetzt. (kenne ich selber nicht)
Da dieses aber anscheinend die erwähnte Free Spire.XLS verwendet, hilft dir dies dann nicht, wenn dies dort fehlerhaft ist.
https://epplusexcel.codeplex.com/ mal geschaut? Ansonsten kannst Du natürlich zum Speichern weiterhin Interop nutzen, sollte insgesamt dennoch schneller sein.
Mit einem freien Trainer haben wir vor einiger Zeit nicht so gute Erfahrungen gemacht, wobei es hier eben sicherlich genauso wie mit den fertigen Dienstleistern ist. Man kann Glück mit dem Trainer haben oder eben aber auch nicht.
Über welchen Weg findet ihr entsprechende freie Trainer, wenn ihr es nicht gerade selber seid?
Tutorials, Videos und Artikel/Blogs sind natürlich gut.
Ich finde jedoch, dass es gerade beim Einstieg wichtig ist, dass man auch konkrete Fragen zur Praxis anbringen kann. Vor allem wenn man sich vorher entsprechend schon mit der Thematik auseinander setzt, ergeben sich diese ja meist zwangsläufig.
wir sind derzeit auf der Suche nach einer Schulung im Bereich der Entwicklung von Restful Schnittstellen mit .NET. Die Teilnehmer bringen dabei wenig bis keine Erfahrung im Web-Bereich mit. Würdet ihr darauf achten, dass diese bereits auf ASP.NET Core basiert?
Ich habe dazu folgende Schulungen gefunden, welche auf den ersten Blick das Themengebiet sinnvoll abdecken:
Kann jemand etwas zu den Schulungsanbietern sagen?
Hat ggf. jemand sogar bereits eine dieser Schulungen besucht?
Kann jemand eine Schulung für diese Thema von einem anderen Anbieter empfehlen?
damit hier überhaupt Feedback kommt :)
Ich muss gestehen ich kann mir das Ganze noch nicht so richtig vorstellen bzw. wie es auf der Applikationsseite aussieht.
Verstehe ich Projekt 1 so richtig?
Es werden verschiedene Module, für übliche Themen wie z.B. Lokalisierung, entwickelt. Für diese Module stellt dein Projekt eine entsprechende UI (welche der Verwender irgendwo hosted?) bereit, um z.B. die jeweiligen Übersetzungen vorzunehmen. Dazu reicht es wenn die gewünschte Applikation deinem Modul eine entsprechende Implementierung für eben diese CRUDs des Moduls liefert?
Wo genau liegt denn dein Problem? Das die Tabellen ein unterschiedliches Schema haben ist erstmal egal.
Du musst jedoch ein Kriterium haben, welches einen Datensatz in beiden Tabellen als zusammengehörig/gleich definiert.
Danach sollte es für dich problemlos möglich sein die Tabelle 3 zu erstellen. Dort sollte es dann ja reichen über beide Tabellen zu iterieren und prüfen ob der Datensatz bereits in Tabelle 3 vorhanden ist. Falls nicht hinzufügen, falls schon ggf. Datensatz anreichern oder eben einfach ignorieren.
Das schließe ich nicht aus. Dann etwas mehr zur tatsächlichen Problemstellung die mich zu der Frage führte:
Ich habe in einer bestehender Implementierung einen Service ItemHistoryCollector. Dieser hat die Aufgabe Historieneinträge zu sammeln und zu speichern. Zusätzlich gibt es nun also einen weiteren Service welcher einen beliebigen Prozess abbildet z.B. Anlegen eines Auftrags. Im Rahmen dieser Prozesse sollen eben auch entsprechend Historieneinträge erzeugt werden, dazu würde der ItemHistoryCollector verwendet werden. Tatsächlich gespeichert werden sollen diese aber nur, wenn die Gesamtaktion erfolgreich war.
In der Theorie also: Beide nutzen die gleiche Datenbankverbindung, der Service zur Prozessabbildung beginnt eine Transaktion und Comitted diese eben acuh wieder.
Hmmm, also doch mit Container als Beispiel. (im Beispiel genutzt SimpleInjector)
var container = new Container();
// Es ginge zwar auch über eine Hybrid LifeTime, aber wie dann der Service3 zu injecten ist, konnte ich noch nicht raus finden. Dafür ist ja ein entsprechendes container.BeginExecutionContextScope() notwendig.
//container.Options.DefaultScopedLifestyle = new ExecutionContextScopeLifestyle();
//container.Register<MyUnitOfWork>(Lifestyle.CreateHybrid(() => container.GetCurrentExecutionContextScope() != null, Lifestyle.Scoped, Lifestyle.Transient));
container.Register<MyUnitOfWork>();
container.Register<MyService1>();
container.Register<MyService2>();
container.Register<MyService3>( () => MyService3Factory.CreateNew(container.GetInstance<MyUnitOfWork>()));
var instance1 = container.GetInstance<MyService1>();
var instance2 = container.GetInstance<MyService2>();
var instance3 = container.GetInstance<MyService3>();
Zusätzlich noch die Factory für MyService3.
public static class MyService3Factory
{
public static MyService3 CreateNew(MyUnitOfWork unitOfWork)
{
return new MyService3(new MyService1(unitOfWork), new MyService2(unitOfWork));
}
}
ich sitze gerade gedanklich vor dem Problem, wie die korrekte Injizierung von Abhängigkeiten aussieht, wenn diese Abhängigkeiten wiederum Abhängigkeiten teilen sollen. Das Stichwort hier ist sicherlich der Scope, aber dessen Verwendung ist mir nicht klar. Konkret geht es um die gemeinsame Nutzung einer Unit und somit auch die gemeinsame Verwendung von Transaktionen.
Als Beispiel könnten folgende Klassen dienen:
class MyUnitOfWork
{
public Guid Id { get; set; }
public MyUnitOfWork()
{
Id = Guid.NewGuid();
}
}
public class MyService1
{
private readonly MyUnitOfWork _myUnitOfWork;
public MyService1(MyUnitOfWork myUnitOfWork)
{
_myUnitOfWork = myUnitOfWork;
}
}
public class MyService2
{
private readonly MyUnitOfWork _myUnitOfWork;
public MyService2(MyUnitOfWork myUnitOfWork)
{
_myUnitOfWork = myUnitOfWork;
}
}
public class MyService3
{
private readonly MyService1 _service1;
private readonly MyService2 _service2;
public MyService3(MyService1 service1, MyService2 service2)
{
_service1 = service1;
_service2 = service2;
}
}
Eine Verwendung ohne Container etc. könnte also so aussehen:
var instance1 = new MyService1(new MyUnitOfWork());
var instance2 = new MyService2(new MyUnitOfWork());
var sharedUnit = new MyUnitOfWork();
var instance3 = new MyService3(new MyService1(sharedUnit), new MyService2(sharedUnit));
Allerdings muss hier der Aufrufende wissen, dass dies so sein muss, was letztlich auch nicht gewollt ist. Wie verbirgt MyService3 also, dass die beiden Abhängigkeiten eine geteilte Instanz von MyUnitOfWork haben sollen?
Edit: Titel von Verwendung von Scopes mit DI geändert. Denke dies ist ohne Bezug zu Container etc. erstmal treffender
Ich würde glaube eher einen Converter nutzen. Alternativ kann auch das Template überschrieben werden. Am Bespiel eines Labels siehe hier: Underscores not displayed in WPF
Ich habe das Sample nun einmal überholt und einige der genannten Punkte einfließen lassen. Die SPA ist aktuell eher weniger lauffähig. Diese ist noch auf die DAL Entities ausgelegt und wirdim Laufe der Woche angepasst.
Grundsätzlich sollten folgende Punkte eingeflossen sein:
- Die API liefert nun nicht mehr die DAL-Entities aus. Stattdessen werden die QueryOptions soweit nötig ausgewertet und entsprechend an den BLL weitergereicht. Die Projektion zwischen DAL und BLL findet dort dann unter Verwendung von AutoMapper statt.
- Die Validation ist in den BLL übergegangen
- Die Interfaces/Modelles sind sofern sinnvoll in eigene Projekte (.Contracts) ausgelagert worden