2016-11-24 1 views
1

Meine Anwendung unterstützt Plug-Ins. Es gibt ein Projekt, PluginUtils, das Schnittstellen und Code enthält. Dieses Projekt ist in der Anwendung und jedem Plugin enthalten.Wohin mit Schnittstellendateien für Plug-Ins?

Das Problem ist, dass eine Schnittstelle ein benutzerdefiniertes Projekt erwähnt, aber PluginUtils bewirkt, dass das benutzerdefinierte Projekt in allen Plug-in-Typen erforderlich ist.

namespace PluginUtils 
{ 
    public interface IPluginSend 
    { 
     [Description("Send an email")] 
     void SendEmail(string subject, string body, List<string> attachments, List<string> toAddresses); 
    } 

    public interface IPluginSave 
    { 
     [Description("Save data")] 
     string SaveData(List<MyClass> data, string resultsPath); 
    } 
} 

Wie kann ich Plug-in zu verhindern, die IPluginSend aus, die den Namespace verweisen implementieren, die MyClass enthält?

bearbeiten

Antwort Aarons war der Schlüssel. Ich musste einige Abhängigkeiten ändern: PluginUtils enthält nicht mehr einen Verweis auf den Namespace MyClass, aber MyClass verweist jetzt PluginUtils.

+0

Sie können nicht - "MyClass" ist Teil des Vertrags. Warum erwähnt das Interface es, wenn es von den Implern nicht gebraucht wird? –

Antwort

1

Versuchen Sie, die Abhängigkeit zu invertieren. Erstellen Sie ein inteface im PluginUtils Projekt, das MyClass implementieren könnte (z IMyClass)

public class MyClass : IMyClass 

Dann ändern Sie Ihre abhängige Schnittstelle, die Schnittstelle anstelle der konkreten Klasse des externen Projekt zu verwenden.

public interface IPluginSave 
{ 
    [Description("Save data")] 
    string SaveData(List<IMyClass> data, string resultsPath); 
} 
+0

Diese Antwort nimmt ziemlich viel von der Art des Systems an, was 'MyClass' ist. Nach allem, was wir wissen, sollte die Schnittstelle generisch sein oder die Abhängigkeit von 'MyClass' könnte einfach auf eine schlechte Zusammensetzung zurückzuführen sein. –