2016-11-24 56 views
1

我的應用程序支持插件。有一個項目,PluginUtils,包含接口和代碼。該項目包含在應用程序和每個插件中。插入接口文件的位置?

問題是一個界面提到了一個自定義項目,但是PluginUtils會導致在所有插件類型中都需要自定義項目。

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); 
    } 
} 

我怎樣才能防止插件,不必引用包含MyClass的命名空間來實現IPluginSend

編輯

阿龍的回答很關鍵。我不得不改變一些依賴關係:PluginUtils不再包含對MyClass命名空間的引用,但MyClass現在引用PluginUtils

+0

您不能 - 'MyClass'是合同的一部分。爲什麼接口提到它,如果實現者不應該需要它? –

回答

1

嘗試反轉依賴關係。創建於PluginUtils項目的界面能夠MyClass的可以實現(例如IMyClass)

public class MyClass : IMyClass 

然後修改相關的接口,使用該接口,而不是具體類的外部工程。

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

這個答案假設了很多關於系統性質的'MyClass'。對於我們所知的所有接口應該是通用的,或者對「MyClass」的依賴性可能僅僅歸結爲糟糕的組合。 –