【问题标题】:Passing Property Classes to Plugin Infrastructure将属性类传递给插件基础设施
【发布时间】:2016-09-01 21:56:59
【问题描述】:

我有以下问题需要一些建议。

我有一个配置,其中包含由标准 IPlugin 接口结构定义的大量插件。 这些接口中的每一个都需要访问大量定义许多属性的外部类 自定义类型。此外,这些类继承自许多基类。

这里的问题是关于如何将这些属性类呈现给每个插件的设计 为了完全访问这些结构。

为了稍微扩展一些类有多个列表,为了便于讨论,最多有 50 个列表,每个列表都有子项 30 到 60 种不同的特性。

现在我当然可以将所有属性类作为依赖项移动到接口类,但作为大多数这些类 继承它成为一个可怕的解决方案。作为 ref 对象传递似乎也不是一个可行的解决方案。

我没有包含任何特定的代码,因为我认为它不会有帮助,但这里是我需要的一个小 psudo 版本 达到。

public interface IPlugin
{
ResultsList PluginProcess(Class1 L1, Class2 L2, ...);

}

class(n) 可能是

public class Class1 : SomeOtherClass
{
public object1 obj1   {get; set; }
...
public object50 obj50 { get; set;}
}

主要由其他派生对象组成。

在插件中我需要能够使用诸如

之类的代码
L1.classes.data[0].codec[2].enabled = true;
and 
L2 newclass2 = new L2();
newclass2.nnnn ...

ResultsList.classes.Add(newclass2);

最后我需要使用插件架构,以便第三方提供数据的自定义处理。

欢迎提出任何建设性的建议。

【问题讨论】:

    标签: c# object plugins properties reference


    【解决方案1】:

    我会考虑基于Dictionary<string, object> 的界面。

    Dictionary 中添加所有具有有用标识符的类。

    dictionary["Class1"] = new Class1(...);
    dictionary["Class2"] = new Class2(...);
    

    然后将Dictionary 传递到您的界面中。

    ResultsList PluginProcess(Dictionary<string, object> context);
    

    这将允许您向消费者提供任意数据。您可以使用 API 文档来描述使用哪个 Key 来获取每个类。这使您可以灵活地随时间增加界面输入。

    可能值得更进一步,为插件上下文设置一个特殊的类。

    class Context
    {
        public Dictionary<string, object> Values;
    
        ...
    }
    

    然后您可以将Context 对象传递到您的界面中。

    ResultsList PluginProcess(Context context);
    

    这为您提供了很大的灵活性,可以随着时间的推移增加界面输入。您还可以在Context 上提供其他功能和数据以帮助您的消费者。

    【讨论】:

    • 我确实查看了一个字典界面,但在搜索时间上被基准标记所取代,因为访问属性名称和值需要进行很多搜索。鉴于你的建议,我会再看看。如果我按对象传递并使用 Visual Studio 查看本地所有属性类,我希望有一些简单而聪明的方法来访问该数据。谢谢