내가 작업하고있는 것에 좋은 디자인을 찾으려고합니다. 예를 들어 TextProcessor 문자열 매개 변수를 허용하고 처리 된 문자열을 돌려주는 클래스를 생각해보십시오.적용 가능한 인터페이스 구현 얻기
내 구현에는 서로 다른 많은 수의 TextProcessors이 있으며, 각각 고유 한 정의 된 문자열 집합을 처리 할 수 있습니다.
bool CanProcess(string text);
및
string Process(string text);
이러한 정적로하지만 난 그들을 설정 아니에요 공통 인터페이스를 구현을 위해 표시 할 수 있습니다 실제로 각 프로세서에 두 개의 주목할만한 방법이 있습니다 공전.
이 외에도 TextProcessors에는 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();
}
}
은 내가이 접근 방식에 대해 미워하는 것은 내가 그들의 CanProcess 함수를 호출하는 모든 알려진 TextProcessor의 인스턴스를 생성해야한다는 것입니다. 나는 CanProcess 기능을 에뮬레이트하는 간단한 Func을 가지는 속성을 만드는 시도
:
[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 : 그것은 당신을 싫증나게 할 필요가 없습니다. –