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()));
  }
...
}

所有抽象基础(当前)独立实现两种算法之一。一个只查看 ImplementationName,而另一个包括 FeaturePattern 测试。我想集中维护算法。

我会特别感兴趣的是一种不会将算法暴露给主机应用程序直接使用的方式,例如对 ImplementationName 或 FeatureName 的扩展方法。

4

1 回答 1

0

一种方法是为您的基类创建一个基类。例如:

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 回答