2016-11-24 61 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”的依赖性可能仅仅归结为糟糕的组合。 –