2016-03-27 7 views
2

Ich versuche, einige C# MVC Legacy-Code in eine gemeinsame DLL zu verschieben. Bis jetzt ging alles gut, aber ich wurde gefragt, dass diese geteilte DLL in keiner Weise auf System.Web verweisen muss.Nicht System.Web Ersatz für HttpPostedFileBase?

Die einzige Art in dieser DLL von System.Web verwendet wird, ist HttpPostedFileBase:

public string ChangeAttachment(int userId, HttpPostedFileBase file) 
{ 
    string attachmentsFolderPath = ConfigurationManager.AppSettings["AttachmentsDirectory"]; 
    if (!Directory.Exists(attachmentsFolderPath)) 
    { 
     Directory.CreateDirectory(attachmentsFolderPath); 
    } 

    string fileTarget = Path.Combine(attachmentsFolderPath, userId.ToString() + Path.GetExtension(file.FileName)); 

    if (File.Exists(fileTarget)) 
    { 
     File.Delete(fileTarget); 
    } 

    file.SaveAs(fileTarget); 

    return fileTarget; 
} 

Wie Sie HTTP oder Web-Funktionalität hier benötigt sehen können, ist, da nur seine FileName und SaveAs() Mitglieder verwendet werden.

Gibt es einen Ersatz, die ich leicht HttpPostedFileBase es bei der Anrufer umwandeln kann, so dass alles, was ich als Parameter übergeben müssen eine nicht-Web-Datei ist?

Hinweis: erbt direkt von System.Object, nicht aus einer Dateiklasse.

+1

Können Sie übergeben und verwenden Sie FileName, um den Anhang anstelle der SaveAs-Methode zu kopieren? –

+0

@MehrzadChehraz Anscheinend kann er nicht. Beachten Sie die 'file.SaveAs (fileTarget)' in seinem Quellcode: Er übergibt auch den Stream. –

+0

@NotSoSharp dann muss er eine Schnittstelle definieren. –

Antwort

3

HttpPostedFileBase ist eine abstrakte Klasse. Die Herausforderung besteht also darin, dass Sie diese Klasse nicht ersetzen, sondern HttpPostedFileWrapper, die Implementierung, ersetzen. (Es ist nicht das, was die Klasse erbt von, es ist das, was von ihr erbt.)

HttpPostedFileWrapper wiederum Referenzen andere System.Web Klassen wie HttpInputStream und ‚HttpPostedFile`.

Sie können es also nicht ersetzen. Vielleicht wollten Sie, indem Sie Sie nicht auf System.Web verweisen, beabsichtigen, Legacy-Code zu verschieben, der nicht direkt mit Web-Funktionen in Verbindung steht, wie zum Beispiel Geschäftslogik. Wenn Sie den Code nicht einfach auslassen können, könnten Sie ihn möglicherweise aus der neuen Assembly herauslassen, die Sie gerade erstellen, und dann eine andere Assembly verwenden, die auf System.Web verweist. Wenn sie diese bestimmte Funktionalität nicht benötigen, verweisen sie nur auf die eine Assembly, aber wenn sie diese benötigen, können sie auch die zweite Assembly hinzufügen, die auf System.Web verweist.

+0

Vielen Dank. Gibt es einen FileStream-Konstruktor, der eine Ableitung von 'HttpPostedFileWrapper' als Parameter akzeptiert? – datps

+1

Nein. Sie können alle Konstruktoren hier anzeigen: https://msdn.microsoft.com/en-us/library/system.io.filestream(v=vs.110).aspx. (Ich verwende die MSDN-Dokumentation für Klassen und Methoden ständig.) –

+0

Vielen Dank. Problem gelöst, indem ich meinen eigenen Konverter schreibe. – datps

1

Wenn Sie nicht die Referenz System.Web referenzieren möchten und auch die Methode SaveAs verwenden möchten, können Sie eine Schnittstelle und auch einen Wrapper definieren, um eine Verbindung herzustellen. Es ist jedoch kein sehr einfacher Ansatz:

+0

Danke. Leider hilft mir eine Schnittstelle hier nicht, denn was ich wirklich brauche, ist ein ** Konverter ** von 'HttpPostedFileBase' /' HttpPostedFileWrapper' zu einem binären Serializer, ähnlich dem hier beschriebenen [in dieser Antwort] (http: // stackoverflow .com/a/22417048/5769938) oder [dieser Artikel] (http://blog.danskingdom.com/saving-and-loading-ac-objects-data-to-an-xml-json-or-binary-file /). – datps

+0

@datps Ich verstehe nicht wirklich, was Ihre Frage mit dem binären Serialisierer zu tun hat. Möglicherweise müssen Sie es zur Klärung aktualisieren. –