0

私が書いたコードには、単純なプラグイン システムがあります。基本的には、基本クラスから継承した Type を受け取り、その上で「CreateInstance」を呼び出します。次に、このインスタンスでメソッドを呼び出します。スーパー クラスは SDK DLL 内にあり、特別なロジックやコードは含まれず、プラグインの作成時にオーバーライドされるスケルトン メソッドのみが含まれます。

プラグイン開発者がログ出力を書き込める「SystemLog」と呼ばれるオブジェクトを利用できるようにしたいと考えています。私の質問は、get/set アクセサーで公開しない限り、インスタンスを作成するときにこのオブジェクトをどのように設定できるかということです。何らかの方法で上書きしたくないので、プラグイン開発者に対して読み取り専用にしたいと思います。

4

1 に答える 1

2

ここに 2 つの質問があります。

  1. SystemLog をプラグインに渡す方法を教えてください。
  2. プラグインから SystemLog を保護するには?

2枚目からいきます。次のようなものを宣言できます

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 型のパラメーターを 1 つだけ持つものがある場合は、CreateInstance(Type)を呼び出してCreateInstance(Type, Object[])を呼び出し、上記のラッパーのインスタンスを渡します。
于 2012-07-20T08:33:45.803 に答える