2012-04-14 6 views
1

Я пытаюсь написать DSL-Проектирование Fluent методы интерфейса

У меня есть методы, которые возвращают строки, но если я хочу, чтобы объединить строки, мне нужно использовать символ +, но я хотел бы назвать методы вместе, но я «м не знает, как достичь его

у меня есть методы на данный момент, такие как

MyStaticClass.Root() MyStaticClass.And() MyStaticClass.AnyInt(), которые возвращают строки

Я хотел бы быть в состоянии сделать

Root().And().AnyInt(), которые приводят к строке

ответ

1

Методы должны возвращать класс оболочки. Методами также являются методы экземпляра класса обертки. Пример:

class Fluent 
{ 
    private string _value; 
    public Fluent And() 
    { 
     this._value += "whatever"; 
     return this; 
    } 
    public Fluent AnyInt() 
    { 
     this._value += "42"; 
     return this; 
    } 
    public override string ToString() { return _value; } 
} 

Кроме того, можно определить неявное или явное преобразование из Fluent в строку, а не (или в дополнение к) в ToString() переопределение.

Кроме того, для производственного кода я бы использовал построитель строк, чтобы избежать многих вызовов до Concat.

+0

String builder append? Как будет выглядеть неявное преобразование, чтобы получить результат? Является ли этот поток также безопасным? – Jon

+1

'public static implicit operator string (Fluent f) {return f.ToString(); } '. См. Http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx –

+0

@Jon. Если вы не планируете использовать один и тот же экземпляр из нескольких потоков, потоковая безопасность не является проблемой, о которой вы должны беспокоиться. Свободные интерфейсы обычно используются в одном методе, а затем отбрасываются. –

3

Вам не нужно использовать символ +. Используйте StringBuilderhttp://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

Пример

StringBuilder builder = new StringBuilder(); 
builder.Append("One string ").Append("Second string").Append("Another string"); 
string final = builder.ToString(); 

Если вы хотите простой пользовательский FluentInterface использовать следующее:

public class MyOwnStringBuilder 
{ 
    public StringBuilder Builder; 


    public MyOwnStringBuilder() 
    { 
     this.Builder = new StringBuilder(); 
    } 

    public static MyOwnStringBuilder Root 
    { 
    get{return new MyOwnStringBuilder();} 
    } 

    public string End 
    { 
    get{return Builder.ToString();} 
    } 

    public MyOwnStringBuilder And(string value) 
    { 
    Builder.Append(value); 
    return this; 
    } 

    public MyOwnStringBuilder AnyInt(string value) 
    { 
     Builder.Append(value); 
     return this; 
    } 
} 

Вы бы использовать:

MyOwnStringBuilder.Root 
     .And("some value") 
     .AnyInt("some new value") 
     .End; 

С уважением.

+0

Вам всегда нужно было бы называть конец? Также это для веб-приложения, так что это поточно-безопасный. Не знаете, как работает статика для безопасности потоков. – Jon

+0

Хороший ответ; Однако я бы переименовал класс :-) – phoog

+0

да, вы должны вызвать End, и нет проблем с безопасностью потоков. @phoog я назвал его после предложенного в вопросе, но да, было бы лучше переименовать его. –

Смежные вопросы