0

プラグインをサポートするアプリケーションを作成しました。現時点では、プラグインの基本クラスは抽象クラスを実装し、それにプラグインの名前を提供します (一部省略):

public class AppExecutePlugin : APlugin
{
    public AppExecutePlugin() : base("Application Execute")
    {

    }
    ... (other stuff here)
}

現在、カスタム属性を使用してプラグインに名前を付けることを考えています (構文エラーは気にしないでください)。

[PluginName("Application Execute")]
public class AppExecutePlugin : APlugin
{
    public AppExecutePlugin()
    {

    }
}

私は自分のアプリで属性を使用することはめったにないので、2 番目のアプローチがより抽象的な実装につながるのか、それとも最初のアプローチと比較して一般的に利点があるのか​​を知りたいと思います。

4

1 に答える 1

1

より抽象的な実装にはなりませんが (これが「抽象性」にどのように影響するかを評価するのは難しいため)、いくつかの利点があります。

  • メタデータを読み取るためにプラグインをインスタンス化する必要はありません。リフレクションを使用して属性情報を読み取るだけです。
  • プラグイン インスタンスは、メタデータを持つためだけに状態 (つまりメンバー) を追加する必要はありません。
  • プラグイン インターフェイスを汚染することなく、簡単に追加の属性を追加したり、これを拡張したりできます。

たとえば、私のプラグインは次のようになります。

[Plugin("FriendlyName", Description = "..", Version = "1.0")]
[RequiresLicense("LicKey.XYZ")]
class MyPlugin : PluginBase {...}

属性がなければ、このすべての情報を基本クラスのコンストラクターに追加する必要があります。もちろん、次のようにプラグイン インターフェイスにメソッドを設定することで、常に回避できます。

public static PluginInfo GetPluginInfo()
{
   return new PluginInfo() { Name = "FriendlyName",
                             Description = "..", 
                             Version = "1.0",
                             License = "lickey.XYZ" };
}

プラグインをインスタンス化せずにリフレクションを使用して実行できるため、属性と同じことが実現できます。もう少し宣言的だと感じるので、私はこのアプローチの属性を好みますが、それは簡単に個人的な好みかもしれません.

于 2012-09-30T11:41:10.507 に答える