试图了解如何创建流畅的界面,以及何时使用它们

Mat*_*att 15 .net c# fluent-interface

如何创建一个流畅的界面而不是更传统的方法?这是一种传统的方法:

接口:

interface IXmlDocumentFactory<T>
{
    XmlDocument CreateXml()                    //serializes just the data
    XmlDocument CreateXml(XmlSchema schema)    //serializes data and includes schema
}

interface IXmlSchemaFactory<T>
{
    XmlSchema CreateXmlSchema()                //generates schema dynamically from type
}
Run Code Online (Sandbox Code Playgroud)

用法:

var xmlDocFactory = new XmlDocumentFactory<Foo>(foo);
var xmlDocument = xmlDocFactory.CreateXml();

//or...

var xmlDocFactory = new XmlDocumentFactory<Foo>(foo);
var xmlSchemaFactory = new XmlSchemaFactory<Foo>();
var xmlDocument = xmlDocFactory.CreateXml(xmlSchemaFactory.CreateXmlSchema());
Run Code Online (Sandbox Code Playgroud)

我想能够说:

var xmlDocument = new XmlDocumentFactory<Foo>(foo).CreateXml().IncludeSchema();
//or...
var xmlDocument = new XmlDocumentFacotry<Foo>(foo).CreateXml(); 
Run Code Online (Sandbox Code Playgroud)

最后,这种情况是否适合流畅的界面?或者更传统的方法会更有意义吗?

n8w*_*wrl 8

使界面流畅的关键是确保方法都返回接口本身的实例,或者还实现可以继续处理的接口的其他一些对象.

因此,在您的情况下,每个IXmlDocumentFactory方法都必须返回一个IXmlDocumentFactory,以便您可以继续调用.最后的方法,如果有的话,返回你真正想要的类型?

它使代码非常易读,但有一点仍然让我有点意思是返回检查.您必须确保无法返回null,否则下一次"流畅的呼叫"将失败.


Bro*_*ass 5

在我看来,有三件事是重要的:

1.)有一个初始方法返回您将要使用的流畅界面

2.)实现您的Fluent接口的类中的每个方法都返回自身,因此您可以继续链接 - 这些是真正流畅的方法.

3.)有一个final方法返回你真正想要构建的类型.

在你的例子中,因为你只有两个方法,它的边界很有用 - 通常你会在一个流畅的界面中有更多的方法.或者(我个人更喜欢)您可以在API中提供两个选项:流畅的API和更传统的API(即带有可选参数).

在你的情况下会做这样的事情:

编辑回复评论.

public interface IXmlDocumentFactory<T>
{
    XmlDocument Create();                    //serializes just the data
    IXmlDocumentFactory<T> WithSchema(XmlSchema schema);    //serializes data and includes schema
}

public class DocumentFactory<T> : IXmlDocumentFactory<T>
{
    private XmlSchema _schema;
    private T _data;

    public DocumentFactory(T data)
    {
        _data = data;
    }
    public IXmlDocumentFactory<T> WithSchema(XmlSchema schema)
    {
        _schema = schema;
        return this;
    }
    public XmlDocument Create()
    {
        if (_schema != null)
        {
            //..use schema/data
            return new XmlDocument();
        }
        else //use data
            return new XmlDocument();
    }

    public static IXmlDocumentFactory<T> From(T data)
    {
        return new DocumentFactory<T>(data);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

var xmlDoc = DocumentFactory<int>.From(42)
                                 .WithSchema(new XmlSchema())
                                 .Create();

var xmlDoc = DocumentFactory<int>.From(42)
                                 .Create();
Run Code Online (Sandbox Code Playgroud)