2012-04-14 5 views
1

나는 DSL을 쓰기 위해 노력하고 있어요설계 유창함 인터페이스 메소드

나는 문자열을 반환하지만 난 내가 + 기호를 사용하는 데 필요한 문자열을 결합하려는하지만 만약 내가 함께하지만 메서드를 호출하고 싶은 방법을 '그것이

나는 순간에 방법이 같은

돌아

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; } 
} 

또한보다는 (또는 첨가 단위) ToString() 재정, 문자열로 Fluent에서 암시 적 또는 명시 적 변환을 정의 할 수 있습니다.

또한 생산 코드의 경우 문자열 작성자를 사용하여 Concat에 대한 많은 호출을 피할 수 있습니다.

+0

String builder append? 결과를 얻기 위해 묵시적인 변환은 어떤 모습일까요? 이 스레드도 안전합니까? – Jon

+1

'public static 암시 적 연산자 문자열 (Fluent f) {return f.ToString(); }'. http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx –

+0

@ 존 (Jon) 여러 스레드에서 같은 인스턴스를 사용하지 않는 한 스레드 안전은 걱정해야 할 사항이 아닙니다. 유창한 인터페이스는 일반적으로 단일 메소드에서 사용 된 다음 삭제됩니다. –

3

+ 기호는 사용할 필요가 없습니다. 간단한 정의는 다음 사용 FluentInterface하려면 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(); 

을 사용

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 질문에 제안 된 이름을 따서 이름을 지었지만 이름을 바꾸는 것이 좋습니다. –