1

サンプル コードは大幅に簡略化されています。要点は、MEF を広範囲に使用するプロジェクトがあるということです。すべての MEF ベースのインターフェイスは IPlugin を実装しています。

public interface IPlugin
{
   ImplementationName ImplementationName {get;}
   bool TryProvide(FeatureName name);
}
public interface IFoo : IPlugin ...
public interface IBar : IPlugin ...

すべてのインターフェースには抽象ベース実装があります

public abstract class FooBase : IFoo 
{
  public abstract ImplementationName ImplementationName {get;}
  protected virtual Regex FeaturePattern {get;}
  public virtual bool TryProvide(FeatureName name)
  {
      return name.ToString() == ImplementationName.ToString() 
        || (FeaturePattern != null && FeaturePattern.IsMatch(name.ToString()));
  }
...
}

すべての抽象ベース (現在) は、2 つのアルゴリズムのいずれかを個別に実装しています。1 つは ImplementationName のみを調べ、もう 1 つは FeaturePattern テストを含めます。アルゴリズムのメンテナンスを一元化したいと考えています。

ImplementationName や FeatureName への拡張メソッドのように、ホスト アプリケーションがアルゴリズムを直接使用できないようにする方法に特に興味があります。

4

1 に答える 1

0

これを行う 1 つの方法は、基本クラスの基本クラスを作成することです。例えば:

public abstract class BazBase : IPlugin
{
    public abstract ImplementationName ImplementationName {get;}
    protected virtual Regex FeaturePattern {get;}
    public abstract TryProvide(FeatureName name);
    protected virtual bool ImplementationNameTest(FeatureName name)
    {
        return name.ToString() == ImplementationName.ToString();
    }
    protected virtual bool FeaturePatternTest(FeatureName name)
    {
        return FeaturePattern != null && FeaturePattern.IsMatch(name.ToString());
    }
}

次に、次のことができます。

public abstract class FooBase : BazBase, IFoo
{
    public virtual bool TryProvide(FeatureName name)
    {
        return ImplementationNameTest(name) || FeaturePatternTest(name);
    }
}

構文の一部が間違っている可能性があります。私は C# プログラマーではありませんが、その考えはわかります。

于 2013-09-20T21:28:28.093 に答える