0

在我编写的一段代码中,我有一个简单的插件系统。基本上,它接受一个继承自基类的类型,并在其上调用“CreateInstance”。然后我调用这个实例中的方法。超类存在于 SDK DLL 中,不包含特殊的逻辑/代码,只是在制作插件时被覆盖的骨架方法。

我希望能够为插件开发人员提供一个名为“SystemLog”的对象,这将使他们能够编写日志输出。我的问题是,我如何在创建实例时填充此对象,除非我使用 get/set 访问器将其公开?我希望它对插件开发人员是只读的,因为我不希望他们以某种方式覆盖它。

4

1 回答 1

2

我在这里看到两个问题:

  1. 如何将 SystemLog 传递给想要使用的插件?
  2. 如何保护 SystemLog 免受插件的影响?

让我从第二个开始。您可以声明类似

public interface ISystemLogger 
{ 
  void log(String message);
}

并在 SystemLog 之上实现一种简单的包装器(您可以将这个包装器的实例传递给插件)。所以插件只知道 ISystemLoggger 接口而不知道它的任何类型的实现

private sealed class SystemLoggerPluginWrapper : ISystemLogger
{
  private readonly SystemLog inner;

  public SystemLoggerPluginWrapper(SystemLog inner) {
    this.inner = inner;
  }

  public void log(string message)
  {
    inner.log(message);
  }
}
  1. 如果您不使用任何类型的依赖注入并手动创建实例,则可以调用 pluginType。GetConstructors () 遍历它们,如果有一个完全具有 ISystemLogger 类型的单个参数,而不是调用CreateInstance(Type) ,则调用CreateInstance(Type, Object[])并传递上面的包装器实例。
于 2012-07-20T08:33:45.803 回答