2016-12-20 44 views
0

我試圖找到一個很好的設計,我工作的事情。作爲一個例子,考慮一個TextProcessor類接受字符串參數並返回已處理的字符串。獲取適用接口實現

現在在我的實現中,有許多不同的文本處理器,每個都有能力處理自己定義的一組字符串。有在每個處理器兩個顯着的方法:

bool CanProcess(string text); 

string Process(string text); 

在現實中,這些可以被標記爲靜態但對於實現一個共同的接口,我不將它們設置爲着想靜態的。

除了這些TextProcessor還有一個靜態TextProcessorFinder類。顧名思義,找到最適合TextProcessor和處理輸入。

public static class TextProcessorFinder 
{ 
    private static List<ITextProcessor> _processors; 

    static TextProcessorFinder() 
    { 
     _processors = Assembly.GetExecutingAssembly().GetTypes() 
      .Where(t => t.GetInterfaces().Contains(typeof(ITextProcessor)) 
      && t.IsClass && !t.IsAbstract) 
      .Select(t => (ITextProcessor)Activator.CreateInstance(t)) 
      .Where(t => t.IsActive) 
      .ToList(); 
    } 

    public static ITextProcessor GetTextProcessor(string text) 
    { 
     return _processors.Where(p => p.CanProcess(text)) 
      .OrderByDescending(p => p.Priority) 
      .FirstOrDefault(); 
    } 
} 

我討厭這種做法是什麼,我要創造每一個已知TextProcessor的實例,只是稱他們CanProcess功能。

我試圖創建一個簡單的函數功能屬性效仿CanProcess功能:

[AttributeUsage(AttributeTargets.Class)] 
public class TextProcessorAttribute : Attribute 
{ 
    private Func<string, bool> func; 

    public TextProcessorAttribute(Func<string, bool> func) 
    { 
     this.func = func; 
    } 
} 

public interface ITextProcessor 
{ 
    bool IsActive { get; } 

    int Priority { get; } 

    bool CanProcess(string text); 

    string Process(string text); 
} 

// Hard-coded to true 
[TextProcessor((s) => { return true; })] 
public class SampleTextProcessor : ITextProcessor 
{ 
    // Implement ITextProcessor 
} 

然而可悲的是,Func鍵不是有效的屬性參數類型。

這樣做的最好方法是什麼?

回答

3

在我看來,創建這些實例是最好的方法。真的沒有理由不這樣做。實例很便宜,創建它們也很便宜,如果你在構造函數中沒有做任何工作 - 反正你不應該這樣做。

+0

我猜這是有效的。他們真的很便宜,但是爲可能是靜態的方法創建一堆實例(接口實現除外)讓我感到畏縮。 –

+0

@ZuiqPazu:它不需要讓你畏縮,它完全沒問題。 –

0

使用CanProcess方法,您可以向每個派生的ITextProcessor詢問他是否可以處理文本。這在我看來是可以的。 也許在ITextProcessor的實現中存在某種專門化,在這種情況下,您可以創建更具體的接口,ITextTypeAProcessor,ITextTypeBProcessor等。然後,您可以按照GetTextProcessor方法中的接口進行過濾。

+0

我明白你要去哪裏了。然而目前我沒有任何進一步的特點來過濾。 –