我試圖找到一個很好的設計,我工作的事情。作爲一個例子,考慮一個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鍵不是有效的屬性參數類型。
這樣做的最好方法是什麼?
我猜這是有效的。他們真的很便宜,但是爲可能是靜態的方法創建一堆實例(接口實現除外)讓我感到畏縮。 –
@ZuiqPazu:它不需要讓你畏縮,它完全沒問題。 –