Gibt es aktuelle Beispiele für die Implementierung von IRepository und einem CustomizedRepositoryItem?

Hi,
ich habe anhand der Hilfe das Interface IRepository implementiert und bin auf einige Probleme dabei gestoßen:

  • Wie es scheint, sind alle auffindbaren Beispiele noch ohne die Ordnerhierarchie.
  • Für was ist der UIName gut und wie kann ich ihn beim ImportProjectFileWithDependencies setzen, da er leider nicht automatisch gefüllt wird z.B. aus dem Filename ohne Extention?
  • Wenn ich das RepositoryItem erweitern möchte, um eigene Daten dort mit abzulegen, weiß ich nicht, wie ich diese schon beim ImportProjectFileWithDependencies mitgeben kann.

Im Gegensatz zu ImportProjectFile, wo es ein userImportData gibt, fehlt dieser aber hier:
public string ImportProjectFileWithDependencies(ListLabel ll, string projectFilePath, string repositoryItemId = null, string folderId = “”)

Hat jemand eine Idee?

Viele Grüße

Alex

Hallo Alex, willkommen im LL Forum :-), ich habe auch das Problem mit dem userImportData gehabt,
Ich habe das anders gelöst, ich würde dir heute Abend oder morgen meine Lösung senden, habe auch eine Repository mit einem customized RepoItem, vielleicht hilft dir das, wie gesagt komme ich aber erst später dazu.
LG

Hi Erdal,

ich habe auch ein CustomizedRepositoryItem. Dort habe ich aus lauter Verzweiflung schon einen UIName eingebaut. Mit ImportProjectFile bekomme ich über das UserImportData ziemlich umständlich den UIName in die DB und in den Descriptor, aber halt leider nicht über ImportProjectFileWithDependencies, weil ich dort kein UserImportData habe.

Außerdem scheint mir irgendetwas mit dem UIName durch die Lappen gegangen zu sein, denn das RepositoryItem.UIName bleibt immer leer, es sei denn, ich setze es selbst mit RepositoryItem.ExtractDisplayName oder aus meinem DB-Feld.

Von daher bin ich gespannt, wie Du das Problem gelöst hast und warte gerne!

LG

Alex

Hi Alex, ich versuch das mal ein wenig rüber zu bringen was ich mache :-), sorry ging nicht früher.
Vorweg es ist eine Web Anwendung (mvc)

Also ich hab eine Klasse Document in meinen Models welche ich als CustomizedRepository Item sozusagen verwenden.

In meinem Konstruktor für die Repository übergebe ich schon das currentDocument, ich habe in meinem Model ein public HttpPostedFileBase File { get; set; }, daraus entsteht mein new Document also →
Nur so als Beispiel mal sind natürlich mehr Infos normalerweise

     var document = new Document()
            {              
                Name = model.Name ?? model.File.FileName,
                IsRepoitem = true,
                Filename = model.Name,
                TypeOfDocument = model.TypeOfDocument,
                DefaultPrinterType = model.DefaultPrinterType
            };

Dann wird der Import aufgerufen, die Repository Klasse hat eine Property currentDocument vom Typ Document, da stehen zur lifetime alle Infos drin, den übergebe ich im Repository Konstruktor, daher brauche ich das importUserData gar nicht.

UIname setze ich folgendermaßen im CreateOrUpdateItem(…)

      public const int GermanLocalId = 1031;
      if (item.ExtractDisplayName(GermanLocalId) == null)
      {
          var descriptorString = item.Descriptor;
          var descriptor = RepositoryItemDescriptor.LoadFromDescriptorString(descriptorString);
          descriptor.SetUIName(GermanLocalId, currentNeededItem.Name);
          item.Descriptor = descriptor.SerializeToString();
      }

da ich das noch für AddNewItem verwende, also LL CreateOrUpdateItem(…) auch für ein neues Projekt aufruft, kriegt mein document was ich im dbcontext später (als DB) speichere noch das hier im CreateOrUpdateItem(…)

var document = dataContext.Documents
                .SingleOrDefault(x => x.ItemRepoId == item.InternalID);

            if (document == null)
            {
                document = new Document()
                {
                    IsRepoitem = true,
                };
                dataContext.Documents.Add(document);
            }

            document.ItemRepoId = item.InternalID;
            document.ItemRepoType = item.Type;
            document.Descriptor = item.Descriptor;
            document.LastModification = item.LastModificationUTC.ToLocalTime(); 
            document.UserId = userId;
            document.Filename = document.Filename == null ? item.ExtractDisplayName() : document.Filename;
            document.Name = item.ExtractDisplayName();

Da ich verschiedene Dinge mache und CreateOrUpdateItem für Import, New usw. aufgerufen wird, habe ich noch eine eigene zweite Import Funktion die in CreatOrUpdateItem aufgerufen wird mit einem IsImport Switch (denn ich vor ImportWithDependency setze)

In meiner Import Funktion:

if (item.Type == RepositoryItemType.Image.Value || item.Type == RepositoryItemType.PDF.Value)
            {
                document.Filename = item.ExtractDisplayName(0);
                if (isDependencyImport) // das setze ich global in der Klasse vor dem ImportWithDependency , damit die Bilder etc. nicht den Namen vom Projekt bekommen und damit ich unterscheiden kann ob ich über ImportImageFile komme.
                {
                    document.Name = item.ExtractDisplayName(0);
                    document.TypeOfDocument = DocumentType.Unknown;
                }
            }
            else
            {
                document.Filename = document.Filename ?? item.ExtractDisplayName();
                if (isPrinterDefinitionsFile) // da ist für den Import von P-Files
                {
                    document.Name = string.Format("{0}{1}", "P-", document.Filename ?? item.ExtractDisplayName());
                }
            }

Meine eigentliche Import Funktion in der Repository welche der controller aufruft sieht so aus->

 public void ImportDocument(string filePath, string printerDefinitionsFilePath, Document document)
        {
            var fileType = GetRepositoryItemTypeForFileExtension(Path.GetExtension(filePath).ToLower());
            pFilePath = printerDefinitionsFilePath;
            isImportFile = true;
            using (RepositoryImportUtil util = new RepositoryImportUtil(this))
            {
                using (ListLabel LL = new ListLabel(){FileRepository = this})
                {
                    if (RepositoryItemType.IsProjectType(fileType))
                    {
                        isDependencyImport = true;
                        util.ImportProjectFileWithDependencies(LL, filePath);
                    }
                    else if (fileType == RepositoryItemType.Image)
                    {
//usw. usw.

Es ist ein wenig komplex und ich kann nicht alles hier posten :wink: , ich hoffe es gibt hier einen Ansatz für dich, ansonsten frag gerne, kein Problem :slight_smile:

Hallo Erdal,

vielen Dank für Deine Beispiele. Dein Code sieht (etwas abgewandelt) genauso aus wie meiner!
Der Unterschied ist nur, dass ich gerne auch FolderId, UIname und weiter Felder in meiner DB setzen möchte, was aber durch das ImportProjectFileWithDependencies nicht abgedeckt wird.

Onur hatte in einem anderen Post von mir geantwortet, dass wohl in LL29 die fehlenden Sachen verfügbar sein werden.

Die unterschiedliche Herangehensweise über die ProjectTypes werde ich bei mir wohl auch noch einbauen müssen. Gerade bei den Printerdefinitions habe ich noch Fragezeichen, aber darum kann ich mich erst kümmern, wenn ich die Basics korrekt drin habe.

Liebe Grüße

Alex